【问题标题】:How to shuffle within a specific dimension in a multidimensional array of complex numbers如何在复数的多维数组中的特定维度内洗牌
【发布时间】:2020-07-20 03:08:08
【问题描述】:

我想洗牌一个具有复数值的 3 维数组,以这样一种方式,元素仅沿第 3 维随机重新排列。

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

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 函数,该函数不适用于复值数组。

【问题讨论】:

  • 没问题
  • 对,我已经提到不存在值的复杂性。我的意思是复数:en.wikipedia.org/wiki/Complex_number。现在有意义吗?我做了另一个编辑。
  • 如果我要添加复数,那么这个例子将是压倒性的。我在使用链接中的解决方案时遇到此错误:“使用索引模式进行复杂输入”

标签: arrays matlab random complex-numbers


【解决方案1】:

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

% 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);

上面的代码将创建一个 5x5 的 4 个元素(即第一维)向量的元胞数组,然后您可以使用cellfun/cell2mat 对第一维进行随机洗牌,然后再次调用permute 来更改它回到原来的尺寸顺序。

【讨论】:

    【解决方案2】:

    您可以非常简单地遍历前两个维度,然后沿第三个维度排列元素:

    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 解决方案更快,因为该解决方案需要存储和使用大量中间数据。

    【讨论】:

    • 谢谢!有没有办法为每次迭代使用相同的排列而不是使用 randperm?
    • @SharonasYkm:你什么意思?您想对整个数组应用相同的排列吗?如果是这样,你根本不需要循环,它更简单! a(:,:,:) = a(:,:,randperm(size(a,3)));
    • 可以,但仅限于三维内。
    • @SharonasYkm:这就是我上面评论中的单行代码所做的,它对每个 a(ii,jj,:) 向量应用相同的排列。您在问题中的示例对每个向量应用了不同的排列,我的答案中的代码也是如此。
    【解决方案3】:

    这是一种矢量化的方式:

    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
    

    【讨论】:

    • 非常聪明。但是确实比循环使用更多的内存! :p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2019-08-18
    • 2011-10-09
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多