我有一个非常大的矩阵A,有N行和M列。我想基本上做以下操作
for k = 1:N
A(k,:) = A(k,randperm(M));
end
但快速有效。 (M和N都非常大,这只是一个更大的外环中的内环。)
更多上下文:我正在尝试为相关矩阵(http://en.wikipedia.org/wiki/Resampling_%28statistics%29)实现置换测试。我的数据非常大,我很不耐烦。如果有人知道实施这种测试的快捷方式,我也很高兴听到您的意见!
我是否有希望避免在循环中这样做?
如果已经被问过,请道歉。谢谢!
答案 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