计算矩阵列的所有组合之间的差异

时间:2013-10-17 03:42:59

标签: matlab matrix combinations vectorization bsxfun

我有大约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列数据加上日期。

1 个答案:

答案 0 :(得分: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];