How can I subtract columns for each row by using a for loop

7 vues (au cours des 30 derniers jours)
Jimmy
Jimmy le 29 Sep 2014
Modifié(e) : Andrei Bobrov le 30 Sep 2014
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 commentaires
Joseph Cheng
Joseph Cheng le 29 Sep 2014
can you expand on what you mean by subtract each column for each row? I do not understand what you're subtracting with.
Jimmy
Jimmy le 29 Sep 2014
Ok.
In this example I use 3 columns. I want to subtract the column for each possible combinations for each row. So lets say for row 1, I want subtract col 1 - 2, col 1 - 3, col 2 - 3 and so on. I want for row 2 the same subtractions.

Connectez-vous pour commenter.

Réponse acceptée

dpb
dpb le 29 Sep 2014
Modifié(e) : dpb le 29 Sep 2014
nk=nchoosek(1:size(x,2),2);
dx=zeros(size(x,1),size(nk,1));
for i=1:size(nk,1)
dx=x(:,nk(i,2))-x(:,nk(i,1));
end

Plus de réponses (3)

Joseph Cheng
Joseph Cheng le 29 Sep 2014
Modifié(e) : Joseph Cheng le 29 Sep 2014
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
Guillaume le 29 Sep 2014
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 commentaires
dpb
dpb le 29 Sep 2014
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
Jimmy le 30 Sep 2014
I choose for option a. Since the 10 smallest pairs are different for each row (the rows are basically the time line (t).) In the end I want to trade each pair for 125 days on a rolling window. For that reason I want to know which pairs I am trading.

Connectez-vous pour commenter.


Andrei Bobrov
Andrei Bobrov le 30 Sep 2014
Modifié(e) : Andrei Bobrov le 30 Sep 2014
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));

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by