元胞数组中每个元胞的随机排列
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);
我有一个 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);