元胞数组中每个元胞的随机排列

Random permutation of each cell in a cell array

我有一个 1-by-4 元胞数组,D。每个单元格元素包含 2-by-2 双精度矩阵。我想独立地对每个矩阵进行随机排列,结果我将具有与 D 相同大小的元胞数组,但其矩阵的元素将被排列,然后进行逆排列以获得原始 D再次.

对于单个矩阵情况,我有代码并且它运行良好,如下所示:

A=rand(3,3)
p=randperm(numel(A));
A(:)=A(p)
[p1,ind]=sort(p);
A(:)=A(ind)

但它不适用于元胞数组。

最简单的解决方案是使用循环:

nd = numel(D);
D_permuted{1,nd} = [];
D_ind{1,nd} = [];
for d = 1:nd)
    A=D{d};
    p=randperm(numel(A));
    A(:)=A(p)
    [~,ind]=sort(p);

    D_permuted{d} = A;
    D_ind{d} = ind;
end

假设您的 D 矩阵只是一个相同大小的列表(例如 2-by-2)矩阵,那么你可以通过使用 3D 双矩阵而不是元胞数组来避免循环。

例如,如果您有这样的 D

n = 5;
D = repmat([1,3;2,4],1,1,n)*10  %// Example data

然后你可以像这样进行排列

m = 2*2;  %// Here m is the product of the dimensions of each matrix you want to shuffle
[~,I] = sort(rand(m,n));  %// This is just a trick to get the equivalent of a vectorized form of randperm as unfortunately randperm only accepts scalars
idx = reshape(I,2,2,n);
D_shuffled = D(idx);