我有大约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
列的数据加上日期。
发布于 2013-10-16 20:40:52
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];
https://stackoverflow.com/questions/19417872
复制相似问题