我有 3D 矩阵(10000 x 60 x 20),我需要排列第二维和第三维以保持列完整。
对于 2D 矩阵,我使用 RANDPERM:
pidx = randperm(size(A,2));
Aperm = A(:,pidx);
我不能只应用 RANDPERM 两次 - 首先是列索引,然后是页索引。随机化不够。
一种解决方案是将矩阵从 3D 重塑为 2D,将列和页压缩为列,对它们进行排列,然后再重塑回来。但我还想以这样的方式进行排列,即每个页面的列独立排列。就像是:
Aperm = zeros(size(A));
for p=1:size(A,3)
pidx = randperm(size(A,2));
Aperm(:,:,p) = A(:,pidx,p);
end
我能做得更有效率吗?还有更好的办法吗?
解决方案#1:在所有页面上排列列
将矩阵从 3D 重塑为 2D
将列和页面压缩到
列,排列它们,然后重塑
后退
A = randi(10, [3 4 2]); %# some random 3D matrix
[r c p] = size(A);
Aperm = reshape(A, [r c*p]);
Aperm = reshape(Aperm(:,randperm(c*p)), [r c p]);
解决方案#2:每页内的列独立排列(相当于你的for循环)
我也想做排列
列排列的方式
每个页面独立
A = randi(10, [3 4 2]); %# some random 3D matrix
[r c p] = size(A);
Aperm = reshape(A, [r c*p]);
[~,idx] = sort(rand(p,c),2); %# this is what RANDPERM does
idx = reshape(bsxfun(@plus, idx',0:c:c*(p-1)),1,[]); %'#
Aperm = reshape(Aperm(:,idx), [r c p]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)