# create columns with for loop

17 ビュー (過去 30 日間)
JessHmann 2019 年 5 月 20 日
コメント済み: JessHmann 2019 年 5 月 21 日
Hello,
I am trying to get the cumultive sum of a column but only between certain rows. The rows are found based on a condition and stored in an array(Rows_I_need). For example [500 1000, 2500].
I want to create the cumulitive sum of row 1-499, 500-999, 1000-2499, 2500-end. I have working code for the start and end section and have created a for-loop for the middle section. My problem is, that the for-loop creates the cumlitive sum between rows 500-999 and then takes the last value as a starting point for the next section rows 1000-2499.
Below is an image explaining the problem and my code:
Rows_I_need=find(FlowData.weightDiffAfter<-0.5); %find sections
c0=cumsum(column1(1:Rows_I_need(1)-1));%cumsum of first section
h=length(Rows_I_need);
c_last=cumsum(column1(Rows_I_need(a):length(column1))); %cumsum of last section
for a=(length(Rows_I-need)-1)
for k=Rows_I_need
c1=cumsum(column1((k:k(a+1)-1)));
end
end

#### 2 件のコメント

Bob Nbob 2019 年 5 月 20 日
What is 'column1?'
I don't see why you need both for loops. You should be able to remove the to loop through the values. Also, am I incorrect that k appears to be a single value? How are you indexing k?
k(a+1)
JessHmann 2019 年 5 月 20 日
column1 is the column of my table that I would like to create the cumulitave sum of for the specified rows.
k is the value of the rows stored in the array. For example if k is [500 1000 2500] I want to create the cumulitive sum of rows 500-999 and rows 1000-2499.
I am quite new to programming and was using (k(a+1)-1) to get the second/next element of the array. I have commented my code for further understanding. Thank you for your help! :)
%Rows_I_need is an array with the values [500 100 2500]
for a=(length(Rows_I-need)-1) %a is 2 so the loop will run twice
for k=Rows_I_need
c1=cumsum(column1((k:k(a+1)-1))); %k(a+1)-1 refers to the next element of the array
end
end

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

### 採用された回答

Rik 2019 年 5 月 20 日
Rows_I_need=[500, 1000, 2500];
%generate random array as input
array=randi(3,4000,1);
%get cumsum
output=cumsum(array);
for k=1:numel(Rows_I_need)
%subtract the value before the new start-point from all subsequent
%points
one_value_up=output(Rows_I_need(k)-1);
output(Rows_I_need(k):end)=output(Rows_I_need(k):end)-one_value_up;
end

#### 1 件のコメント

JessHmann 2019 年 5 月 21 日
Thank you very much! That worked perfectly! :)

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

Translated by