MATLAB randomly permuting columns differently

允我心安 提交于 2019-12-20 02:32:57

问题


I have a very large matrix A with N rows and M columns. I want to basically do the following operation

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

but fast and efficiently. (Both M and N are very large, and this is only an inner loop in a more massive outer loop.)

More context: I am trying to implement a permutation test for a correlation matrix (http://en.wikipedia.org/wiki/Resampling_%28statistics%29). My data is very large and I am very impatient. If anyone knows of a fast way to implement such a test, I would also be grateful to hear your input!

Do I have any hope of avoiding doing this in a loop?

Apologies if this has already been asked. Thanks!


回答1:


If you type open randperm (at least in Matlab R2010b) you'll see that its output p for an input M is just

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

So, to vectorize this for N rows,

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

Thus, generate P and use linear indexing into A:

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

Example: given

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

one (random) result is

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


来源:https://stackoverflow.com/questions/29156823/matlab-randomly-permuting-columns-differently

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!