MATLAB以不同的方式随机排列列

时间:2015-03-19 23:28:18

标签: matlab large-data

我有一个非常大的矩阵A,有N行和M列。我想基本上做以下操作

for k = 1:N
    A(k,:) = A(k,randperm(M));
end

但快速有效。 (M和N都非常大,这只是一个更大的外环中的内环。)

更多上下文:我正在尝试为相关矩阵(http://en.wikipedia.org/wiki/Resampling_%28statistics%29)实现置换测试。我的数据非常大,我很不耐烦。如果有人知道实施这种测试的快捷方式,我也很高兴听到您的意见!

我是否有希望避免在循环中这样做?

如果已经被问过,请道歉。谢谢!

1 个答案:

答案 0 :(得分:4)

如果您输入open randperm(至少在Matlab R2010b中),您会看到输入p的输出M只是

[~, p] = sort(rand(1,M));

因此,要为N行进行矢量化,

[~, P] = sort(rand(N,M), 2);

因此,生成P并将linear indexing用于A

[~, P] = sort(rand(N,M), 2);
A = A(bsxfun(@plus, (1:N).', (P-1)*N));

示例:给出

N = 3;
M = 4;
A = [ 1     2     3     4
      5     6     7     8
      9    10    11    12 ];

一个(随机)结果是

A =
     2     3     1     4
     7     5     8     6
     9    11    12    10