Reputation: 263
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!
Upvotes: 3
Views: 152
Reputation: 112659
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
Upvotes: 4