How to manipulate in matrix

4 Ansichten (letzte 30 Tage)
Zhan
Zhan am 22 Mai 2017
Beantwortet: Andrei Bobrov am 25 Mai 2017
Assume matrix i:
i = [
10010 8
10010 5
10010 2
10065 8
10065 6
10099 4
10099 2
10099 9
10099 4
10099 1
];
The first column is ID. There are three different IDs and repeated for 10 rows. I want to sum the second column corresponding to each ID as follows:
j = [
10010 15
10010 15
10010 15
10065 14
10065 14
10099 20
10099 20
10099 20
10099 20
10099 20
];
  3 Kommentare
Zhan
Zhan am 22 Mai 2017
@the cyclist Thank you for your comment. How can I accept an answer?
Guillaume
Guillaume am 22 Mai 2017
How can I accept an answer?
By clicking on the big blue button that says "Accept this answer" above the answer you want to accept.

Melden Sie sich an, um zu kommentieren.

Antworten (3)

Image Analyst
Image Analyst am 22 Mai 2017
Sounds like it might be homework. Here's a start. See if you can finish it.
out = accumarray(i(:, 1), i(:, 2));
out(out==0) = []
Returns [15;14;20]
  1 Kommentar
Zhan
Zhan am 22 Mai 2017
out = out(i(:,1),:)
% works if IDs are [1,1,1,2,2,3,3,3,3,3]. Any tips for the oroginal ID?

Melden Sie sich an, um zu kommentieren.


Akira Agata
Akira Agata am 25 Mai 2017
How about using splitapply function.
A = [
10010 8
10010 5
10010 2
10065 8
10065 6
10099 4
10099 2
10099 9
10099 4
10099 1
];
[G, ID] = findgroups(A(:,1));
B = [ID, splitapply(@sum,A(:,2),G)];
Now, the output matrix B is as follows:
B =
10010 15
10065 14
10099 20

Andrei Bobrov
Andrei Bobrov am 25 Mai 2017
[~,~,c] = unique(ii(:,1));
D = accumarray(c,ii(:,2));
out = [ii(:,1), D(c)];

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by