2013-10-17 3 views
1

J'ai environ 1000 colonnes de données. Je veux créer un autre tableau comprenant les différences entre toutes les combinaisons possibles des colonnes pour toutes les lignes de données. Je peux y aller en utilisant une boucle for, mais y a-t-il un moyen plus simple pour MATLAB de le faire?Calcul des différences entre toutes les combinaisons de colonnes de la matrice

Les données sont dans le format suivant

Date Col1 Col2 ..... Col1000 
.  . .    . 
.  . .    . 

J'ai besoin le tableau final dans le format suivant

Date Col1-Col2 Col1-Col3 .... Col1-Col1000 Col2-Col3 Col2-Col4 ..... Col2-Col1000 

et en continuant à Col999-Col1000 pour un total de nchoosek(1000,2)+1 colonnes de données ainsi que les dates .

+0

toutes les combinaisons possibles signifie aussi 'Col2-Col1, Col2-Col2 'etc ... – bla

Répondre

4

bsxfun peut pratiquement se répliquer dans plus d'une dimension, vous permettant d'éviter une boucle (défaitistes désolé et amer bas-électeurs, il est vrai):

P = 50; N = 1000; A = rand(P,N); 

% bsxfun for singleton expansion: 50x1000x1 @minus 50x1x1000 => 50x1000x1000 
B = bsxfun(@minus,A,permute(A,[1 3 2])); 
B = reshape(-B,size(A,1),[]); 

Cela donne une matrice P-by-N*N qui fournit tous les combinaisons. Pour obtenir le éclairci (c.-à sum(1:N-1) colonnes) matrice:

m = logical(tril(ones(N),-1)); % lower triangular logical not including diagonal 
B = B(:,m(:)); 

Enfin, concaténer les dates pour obtenir ce dont vous avez besoin:

C = [dates B]; 
+0

pour la généralité, s'il vous plaît remplacer' 50' avec la bonne dimension de A (taille (A, 1)) dans la troisième ligne ... – bla

+1

+1, je voulais aussi une solution bsxfun, mais j'ai oublié ' permute' ... – bla

+2

Merci. Je dois me rappeler de penser à des dimensions plus élevées pour exploiter 'bsxfun' de cette façon. – chappjc

Questions connexes