【问题标题】:Computing differences between all combinations of matrix columns计算矩阵列的所有组合之间的差异
【发布时间】:2013-10-17 03:42:59
【问题描述】:

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

【问题讨论】:

  • 所有可能的组合也意味着Col2-Col1, Col2-Col2等...

标签: matlab matrix combinations vectorization bsxfun


【解决方案1】:

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];

【讨论】:

  • 为了一般性,请将第3行中的50替换为A的正确尺寸(size(A,1))...
  • 谢谢。我必须提醒自己考虑更高的维度来以这种方式利用bsxfun
  • 你如何找出问题指定方式的差异?
  • @Nirk - 有点像你做的,只是不同。 ;) 查看我的更新答案。
  • @rayryeng 为虚假的find/length 的回答万岁 - 那必须走!是的,SheetJS 的答案很好,而且比我的内存效率高得多,但我只需要演示它是如何完成的。 :) 他不喜欢这样 :D
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2019-10-11
  • 2021-07-23
相关资源
最近更新 更多