フィルターのクリア

Sum matrix with repeating indices

1 回表示 (過去 30 日間)
Emma Kuttler
Emma Kuttler 2022 年 3 月 20 日
編集済み: Stephen23 2022 年 3 月 21 日
Hi! I have one matrix, A, that has one column of identifier values (with repeats and some missing numbers) and a column of values. I'd like to produce a column of all of the unique values and then another column of their sum. For example, if A is as follows, i want to produce B.
A = [1 2
1 -3
2 0
3 3
5 6
2 -4
4 0.5
7 9
7 2]
% I want to produce B
B = [1 -1
2 -4
3 3
4 0.5
5 6
7 11]

採用された回答

Stephen23
Stephen23 2022 年 3 月 20 日
編集済み: Stephen23 2022 年 3 月 21 日
A simple MATLAB approach:
A = [1,2;1,-3;2,0;3,3;5,6;2,-4;4,0.5;7,9;7,2]
A = 9×2
1.0000 2.0000 1.0000 -3.0000 2.0000 0 3.0000 3.0000 5.0000 6.0000 2.0000 -4.0000 4.0000 0.5000 7.0000 9.0000 7.0000 2.0000
[G,U] = findgroups(A(:,1));
M = [U,accumarray(G,A(:,2))]
M = 6×2
1.0000 -1.0000 2.0000 -4.0000 3.0000 3.0000 4.0000 0.5000 5.0000 6.0000 7.0000 11.0000
  2 件のコメント
Stephen23
Stephen23 2022 年 3 月 20 日
編集済み: Stephen23 2022 年 3 月 20 日
"What is your definition of simple?"
Hmmm... off the top of my head, something like this: simple code uses functions and syntax whose intent is clear, making understanding the code intent easier to understand when it is read through by regular users of that language, and generally making the code more efficient. Simple code utilizes existing routines effectively (i.e. does not reinvent the wheel), and only specializes sufficiently to solve the task at hand.
"Where can I find a reference to this?"
When I search for "simple code" using a major internet search engine it returned 2690000 results. I read a few of them just now, this one I think gives a reasonable summary (it also happens to match very closely with my own definition of "simple" given above):
The concept of abstraction seems to be very commonly associated with simple code:
I.e. understanding the underlying model and knowing how that can be best represented in code.
"How is it measured?"
I can think of several ways to measure it:
  • syntax metrics (e.g. cyclomatic complexity, number of operations, etc)
  • use of existing routines and paradigms as much as reasonable (related to abstraction)
  • use of methods that are generalized as much as reasonable, e.g. type/data agnostic
  • metrics related to maintainability, readability, etc.
Note that simpler does not mean shorter.
Steven Lord
Steven Lord 2022 年 3 月 21 日
Instead of using findgroups and accumarray I would probably use groupsummary.
A = [1,2;1,-3;2,0;3,3;5,6;2,-4;4,0.5;7,9;7,2];
[values, groups] = groupsummary(A(:, 2), A(:, 1), @sum);
results = [groups, values]
results = 6×2
1.0000 -1.0000 2.0000 -4.0000 3.0000 3.0000 4.0000 0.5000 5.0000 6.0000 7.0000 11.0000

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

その他の回答 (1 件)

Voss
Voss 2022 年 3 月 20 日
編集済み: Voss 2022 年 3 月 20 日
One perfectly valid MATLAB approach:
A = [1 2
1 -3
2 0
3 3
5 6
2 -4
4 0.5
7 9
7 2];
[uA,~,jj] = unique(A(:,1));
n_uA = numel(uA);
B = [uA zeros(n_uA,1)];
for ii = 1:n_uA
B(ii,2) = sum(A(jj == ii,2));
end
disp(B)
1.0000 -1.0000 2.0000 -4.0000 3.0000 3.0000 4.0000 0.5000 5.0000 6.0000 7.0000 11.0000
% % I want to produce B
% B = [1 -1
% 2 -4
% 3 3
% 4 0.5
% 5 6
% 7 11];

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

製品


リリース

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by