如何在复数的多维数组中的特定维度内洗牌

How to shuffle within a specific dimension in a multidimensional array of complex numbers

我想打乱一个具有复数值的 3 维数组,以便元素仅沿第 3 维随机重新排列。

例如,整数 A 的 3D 数组(提醒我正在寻找相同的解决方案,但对于 复杂 数字数组):

A(:,:1)= 1 2 3 ; 4 5 6 ; 7 8 9
A(:,:2)= 10 11 12; 13 14 15 ; 16 17 18

打乱第三个维度后,可能的输出可能是:

A(:,:1)= 10 2 3 ; 4 14 6 ; 7 17 18
A(:,:2)= 1 11 12; 13 5 15 ; 16 8 9

我该怎么做?

我发现的 only solution 包括编译的 c 函数,它不适用于复值数组。

下面的脚本在第 3 维进行随机洗牌,

% creating a sample data, can be complex numbers
x=magic(10);
x=reshape(x,[4,5,5]);

% split 3D matrix into 2D cell arrays of vectors, permute those, and get back to 3D
y=num2cell(x,3);
newy=cellfun(@(x) x(randperm(length(x))), y,'uni',false);
newx=cell2mat(newy);

您可以调用 permute 然后调用 num2cell 以不同的方式对您的 3D 数组进行分区,以便在不同的维度中随机播放它,例如,

x=permute(x,[2,3,1]);
y=num2cell(x,3);

上面的代码将创建一个由 4 个元素(即第一维)组成的向量的 5x5 元胞数组,然后您可以使用 cellfun/cell2mat 对第一维进行随机改组,然后调用 permute 再次将其改回原始维度顺序。

您可以非常简单地迭代前两个维度,并沿第三个维度排列元素:

a = randn(3,5,2) + 1i*randn(3,5,2); % some complex data

for jj=1:size(a,2)
  for ii=1:size(a,1)
    a(ii,jj,:) = a(ii,jj,randperm(size(a,3)));
  end
end

请注意,对于非常大的数组,此解决方案可能比另一个答案中的 cellfun 解决方案更快,因为该解决方案需要存储和使用大量中间数据。

这是一种矢量化的方式:

A = cat(3, [1 2 3; 4 5 6; 7 8 9], [10 11 12; 13 14 15; 16 17 18]); % define data
s = size(A); % get size of A
[~, ind] = sort(rand(s), 3); % indices of random permutations along 3rd dim
result = A(reshape(1:s(1)*s(2),s(1),s(2)) + (ind-1)*s(1)*s(2)); % linear index and result