How can add the rows in n-by-m matrix that have the same indicator in the last column?

1 回表示 (過去 30 日間)
Hi,
How can add the rows in n-by-m matrix that have the same indicator in the last column?
For example: 10-by-3 matrix, the third column is the indecator:
253638 3309 2
223389 3309 2
255968 3309 2
243943 33309 2
245568 63309 1
242490 93309 3
268464 23309 2
272665 53309 1
241206 83309 1
259310 13309 2
I want to add all rows (all values in first column with the same indicator) with ( all values in second column with the same indicator).

採用された回答

Jos (10584)
Jos (10584) 2016 年 6 月 6 日
X = [253638 3309 2
223389 3309 2
255968 3309 2
243943 33309 2
245568 63309 1
242490 93309 3
268464 23309 2
272665 53309 1
241206 83309 1
259310 13309 2]
OUT = cell2mat(arrayfun(@(k) [sum(X(X(:,3)==k,[1 2]),1) k], unique(X(:,3)),'un',0))
  2 件のコメント
Abdulatif Alabdulatif
Abdulatif Alabdulatif 2016 年 6 月 6 日
Thanks for a single line answer!!
Could you add another column which contains how many data points belong to each class?
Jos (10584)
Jos (10584) 2016 年 6 月 6 日
Juts modify the function used by arrayfun
OUT = cell2mat(arrayfun(@(k) [sum(X(X(:,3)==k,[1 2]),1) k sum(X(:,3)==k)], unique(X(:,3)),'un',0))

サインインしてコメントする。

その他の回答 (2 件)

Azzi Abdelmalek
Azzi Abdelmalek 2016 年 6 月 6 日
編集済み: Azzi Abdelmalek 2016 年 6 月 6 日
You can use accumarray function
A=[253638 3309 3
223389 3309 2
255968 3309 2
243943 33309 2
245568 63309 1
242490 93309 3
268464 23309 2
272665 53309 1
241206 83309 1
259310 13309 2]
[ii,~,jj]=unique(A(:,3))
out=accumarray(jj,(1:numel(jj))',[],@(x) {sum(A(x,1:2),1)})
out=[ cell2mat(out) ii]
  2 件のコメント
Walter Roberson
Walter Roberson 2016 年 6 月 6 日
That would be tricky to do without one accumarray call per column.
Abdulatif Alabdulatif
Abdulatif Alabdulatif 2016 年 6 月 6 日
The first command is work!
the next two command show the following error:
Index exceeds matrix dimensions.
Error in @(x){sum(A(x,1:2),1)}

サインインしてコメントする。


Walter Roberson
Walter Roberson 2016 年 6 月 6 日
unique() to find the unique indicators and the number of indicators. Allocate an zero array of appropriate size to hold the results. Loop over the unique indicators finding the rows that match and totaling them and storing that in the results array.
accumarray() is not suitable for your purposes because accumarray cannot operator on row vectors of values.
Alternately if you convert the data into a table, you could perhaps use varfun()
  4 件のコメント
Abdulatif Alabdulatif
Abdulatif Alabdulatif 2016 年 6 月 6 日
編集済み: Abdulatif Alabdulatif 2016 年 6 月 6 日
I got the following error for the second line of the loop. The marix name is y
Index exceeds matrix dimensions.
Error in kmc (line 46)
results(K, :) = sum( y( y(:,end) == ind, 1:end-1) );
what is the issue in this case?
Abdulatif Alabdulatif
Abdulatif Alabdulatif 2016 年 6 月 6 日
編集済み: Stephen23 2016 年 6 月 6 日
It was my machine problem and the code works prefectly.
Thanks

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by