How can I subtract columns for each row by using a for loop
이전 댓글 표시
Hi,
I have a matrix like this:
[1.011 1.004 1.054
1.008 0.998 1.042
0.984 0.988 1.024
1.026 1.006 1.016
1.000 0.996 0.977]
I would like to subtract each column for each row and store these results in a new matrix. How can I do this?
Thanks!
댓글 수: 2
Joseph Cheng
2014년 9월 29일
can you expand on what you mean by subtract each column for each row? I do not understand what you're subtracting with.
Jimmy
2014년 9월 29일
채택된 답변
추가 답변 (3개)
Joseph Cheng
2014년 9월 29일
편집: Joseph Cheng
2014년 9월 29일
you can use combnk() or nchoosek to determine the combination of column subtraction and perform a for loop for each combination.
X = randi(10,4,3);
combin = combnk(1:size(X,2),2);
for ind = 1:size(X,2)
newX(:,ind) = X(:,combin(ind,1))-X(:,combin(ind,2));
end
Guillaume
2014년 9월 29일
Use nchoosek to get all possible combinations of columns, and use that to calculate your differences:
m = [1.011 1.004 1.054
1.008 0.998 1.042
0.984 0.988 1.024
1.026 1.006 1.016
1.000 0.996 0.977];
colcomb = nchoosek(1:size(m, 2), 2);
coldiff = zeros(size(m, 1), size(colcomb, 1));
for comb = 1:size(colcomb, 1)
coldiff(:, comb) = diff(m(:, colcomb(comb, :)), 1, 2);
end
댓글 수: 7
Jimmy
2014년 9월 29일
Guillaume
2014년 9월 29일
Not in a matrix obviously, since it can only contain numbers. You could create a cell array of column names
colnames = cell(size(colcomb, 1));
for comb = 1:size(colcomb, 1)
colnames{comb} = sprintf('%d-%d', colcomb(comb, 2), colcomb(comb, 1));
end
Note that the difference calculated are 2-1, 3-1, 3-2, and I've represented that in the names.
Jimmy
2014년 9월 29일
dpb
2014년 9월 29일
For what working definition of small? But, basic idea is one of two choices...
a) go ahead and generate all pairs and then compute the comparison statistic and choose the N smallest of those, or,
b) compute each pair and the statistic at same time; after N replace the largest of those kept with the last if new is less; update the maxValue comparison value.
Jimmy
2014년 9월 30일
Andrei Bobrov
2014년 9월 30일
편집: Andrei Bobrov
2014년 9월 30일
X = [1.011 1.004 1.054
1.008 0.998 1.042
0.984 0.988 1.024
1.026 1.006 1.016
1.000 0.996 0.977];
n = nchoosek(1:size(X,2),2);
out = squeeze(diff(reshape(X(:,n'),[],2,3),1,2));
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!