For loop question with matrix
이전 댓글 표시
I have a matrix as below called A (60x3 double)
A = [10 3.5 -34.66
9 3.5 -35.6
8 3.5 -31.43
7 3.5 -29.04
6 3.5 -27.81
5 3.5 -26.59
4 3.5 -23.69
3 3.5 -16.47
2 3.5 2.94
1 3.5 24.03
5 3.5 25.86
4 3.5 35.98
3 3.5 55.89
2 3.5 91.82
1 3.5 101.5
6 3.5 -63.5
5 3.5 -67.03
4 3.5 -72.58
3 3.5 -80.98
2 3.5 -85.91
1 3.5 -63.15
7 3.5 -20.23
6 3.5 -19.92
5 3.5 -20.05
4 3.5 -19.69
3 3.5 -13.96
2 3.5 11.57
1 3.5 30.76
3 3.5 63.36
2 3.5 99.82
1 3.5 107.13
10 3.5 -47.09
9 3.5 -61.25
8 3.5 -61.89
7 3.5 -63.07
6 3.5 -65.29
5 3.5 -69.63
4 3.5 -76.96
3 3.5 -84.92
2 3.5 -80.39
1 3.5 -57.89]
I want to sum column 2 values until column 1 value is 1. I mean first sum must be on row 1 to row 10, and 2nd sum must be on row 15 to row 20, 3rd sum must be on row 21 to row 26 etc.
How can i do that with using for loop or another way?
댓글 수: 1
Adam Danz
2019년 3월 23일
The number 1 is in the following rows of column 1:
>> find(A(:,1)==1)
ans =
10
15
21
28
31
41
so I'm having trouble figuring out what rule you're using to select row numbers.
답변 (2개)
Walter Roberson
2019년 3월 23일
locs = [find(A(:,1)==1); size(A,1)+1];
tsum = cumsum([0;A(:,2)]);
output = tsum(locs(2:end)) - tsum(locs(1:end-1));
댓글 수: 10
Walter Roberson
2019년 3월 23일
G = cumsum(a(:,1)==1) + 1;
results = splitapply(@YourFunction, a, G)
YourFunction will be passed a subset of a to process. The first subset will be the portion before the first 1; if it is important that that subset not be processed, then it would not be difficult to skip it.
Gko K
2019년 3월 23일
Walter Roberson
2019년 3월 23일
Rewrite your code so that it can take as input a subsection of a matrix that has already been split, and calculates the appropriate values, and returns them as a vector or as a cell array.
splitapply will put all of the results together into a single array, one row per group.
Gko K
2019년 3월 23일
Walter Roberson
2019년 3월 23일
function result = YourFunction(subset)
b = subset(:,1);
c = subset(:,2);
vd = subset(:,3);
a bunch of statements here
result = {v, ve}; %or whatever you want to remember about the subset
end
Gko K
2019년 3월 24일
Walter Roberson
2019년 3월 24일
No, your code is not well enough commented for me to be able to figure out what you want to compute.
If you were given one subset, that began with a "1" and ended just before the next "1", then what outputs would you calculate from it?
Adam Danz
2019년 3월 24일
Yeah, that was unclear to me from the beginning.
"I want to sum column 2 values until column 1 value is 1."
With your input matrix "A", 's' is the sum of column 2 for each group.
% Create group numbers for each row
rowGroups = cumsum([0;A(1:end-1,1)] == 1)+1;
% Calculate sum of col 2 for each group
s = splitapply(@sum, A(:,2), rowGroups)
댓글 수: 5
Gko K
2019년 3월 24일
I have a feeling most of your code can be replaced by a few lines of code. The code you shared is hard to follow for the following reasons.
- It's not properly indented. If you select all of your code in matlab editor and then press ctrl+i, your code will be properly indented and much easier to read.
- You have redundant variables. Instead of doing this: b=a(:,1), just use a(:,1) whenever you're useing 'b'. There's no need to take apart the 'a' matrix and reassign each column to a new variable. Likewise, "length(b)" can be "size(a,1)".
- Meaningless variable names. hwt3, vv, c, vd, etc. The only way to understand what those variables are is to deconstruct the entire code. Instead, use variable names that are meaningful. For example, instead of "ht=sum(c)", you could use "sumCol2 = sum(a(:,2))". Instead of "vv=max(vd)", you could use "maxCol3 = max(a(:,3))"
- Use comments. Explain the steps you're taking by inserting %comments above or to the right of each section of code.
Gko K
2019년 3월 24일
Adam Danz
2019년 3월 24일
We've all been there.
Gko K
2019년 3월 25일
카테고리
도움말 센터 및 File Exchange에서 Matrices and Arrays에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
