2013-10-17 136 views
1

我有大約1000列的數據。我想創建另一個數組,其中包含所有數據行的列的所有可能組合之間的差異。我可以使用for循環來解決這個問題,但是在MATLAB中有更簡單的方法來做到這一點嗎?矩陣列的所有組合之間的計算差異

數據是按以下格式

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

我需要的陣列天線的最終要在以下格式

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

並繼續Col999-Col1000共數據的nchoosek(1000,2)+1列加上日期的。

+0

所有可能的組合也意味着'col2的-Col1中,col2的,col2的'等... – bla

回答

4

bsxfun幾乎可以複製在不止一個尺寸,讓您避免環路(對不起反對者和苦向下選民,這是真的):

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),[]); 

,給出了一個P-by-N*N矩陣提供全部爲的組合。 (與sum(1:N-1)列即),以獲得淡出矩陣:

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

最後,串連日期以獲得您所需要的:

C = [dates B]; 
+0

一般性,請在第3行用A(尺寸(A,1))的適當尺寸替換'50' ... – bla

+1

+1,我也想要一個bsxfun解決方案,但忘了' permute' ... – bla

+2

謝謝。我不得不提醒自己考慮更高維度來以這種方式利用'bsxfun'。 – chappjc