【问题标题】:apply matrix randomisation without for loop in matlab在matlab中应用没有for循环的矩阵随机化
【发布时间】:2012-02-01 10:27:42
【问题描述】:

关于 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 的情况下执行此操作?我需要多次随机化迭代,并且可以负担索引的好处。

干杯!

编辑:在 Alexandrew 的 cmets 之后的一些想法

我创建了一个随机化 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,size(M,3)) 的元胞数组,每个元胞都包含随机数组。

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

【问题讨论】:

  • arrayfun 可能对你有帮助:)

标签: matlab


【解决方案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{:});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多