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数据列和日期。

4

1 回答 1

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];
于 2013-10-17T04:40:52.637 回答