关于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矩阵中制作它?
答案 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{:});