在matlab中应用矩阵随机化而不是for循环

时间:2012-02-01 10:27:43

标签: matlab

关于matlab和关于行和列的3d矩阵随机化的问题。

我有一个n x n x s矩阵M,我想把它搞砸一点,但有一些控制。

我可以用for循环实现我的愿望

for j=1:size(M,3)
r=randperm(size(M,1));  
random_M(:,:,j)=M(r,r,j); 
end

有没有办法在不必循环j的情况下执行此操作?我需要许多随机化迭代,并且可以提供索引的好处。

干杯!

编辑:继亚历山德拉的评论之后还有一些想法

我创建了一个函数来随机化M的压缩版本:

function randomMat=randomiseMat(Mat)
[rows,cols]=size(Mat);
r=randperm(rows);
randomMat=Mat(r,r);

然后,使用arrayfun我似乎得到了我想要的东西:

randomM=arrayfun(@(x) randomiseMat(M(:,:,x)),1:size(M,3),'UniformOutput', false)

然而,randomM现在是一个大小为1的单元格数组(大小为(M,3)),每个单元格都包含随机数组。

有没有办法像输入M那样在3d矩阵中制作它?

1 个答案:

答案 0 :(得分:1)

您可以一次性计算r的所有值,然后使用arrayfun

[nRows,nCols,nPages] = size(M);
[~,r]=sort(rand(nRows,nPages));

%# you should test on a realistic example whether a for-loop
%# isn't faster here
outCell = arrayfun(@(x) M(r(:,x),r(:,x),x), 1:nPages,'UniformOutput',false);
randomM = cat(3,outCell{:});