【问题标题】:Randomly select Elements of 4D matrix in Matlab在 Matlab 中随机选择 4D 矩阵的元素
【发布时间】:2015-09-06 17:03:05
【问题描述】:

我有一个尺寸为 7x4x24x10 的 4D 矩阵(我们称之为 main_mat)。我想得到一个大小为 7x4x24 (rand_mat) 的矩阵,以便这个 (rand_mat) 矩阵的每个元素实际上都是从主矩阵 (main_mat) 中均匀随机抽取的。如果我没有把问题说清楚,我很抱歉,所以我试着解释一下:

我有 24 张 7x4 元素的堆栈,我有 10 个这样的堆栈。我想要的是我得到一叠 24 张 7x4 元素的单叠,这样,从结果单叠中的每个元素都是从 10 叠中完全相同的纸张编号中均匀随机抽取的。不使用循环怎么办?

【问题讨论】:

  • 您的问题对我来说仍然不是 100% 清楚。你想得到一个 7x4x24 矩阵,其中的数字从 7x4x24x10 矩阵中选择,这样 7x4x24 矩阵中的每个位置都只能是另一个矩阵中的 x10 之一?
  • 没错。例如元素 (1,1,1) 只能在该位置可用的 10 个元素中,即它们只能来自 (1,1,1,randi(10)) 等等。
  • 我试过这样的东西'k = datasample(j,1,4);'结果是它从 7x4 的一张纸中随机开始,然后所有剩余的 23 张纸都按顺序排列。我不知道我在这里做错了什么。
  • @AWAbid - 好的,我想我知道你想要什么。对于这个 7 x 4 x 24 矩阵中的每个位置,您想确保我们从 10 个堆栈中统一选择一个吗?例如,给定输出中的位置(1,1,1),我们将从堆栈中随机选择(1,1,1,randi(10))?
  • 没错@rayryeng 谢谢你的理解。

标签: matlab matrix random 4d


【解决方案1】:

如果我正确地解释了您想要的内容,对于这个 7 x 4 x 24 矩阵中的每个唯一 3D 位置,您需要确保我们从共享相同 3D 空间位置的 10 个堆栈中的一个中随机采样.

我建议您生成 1 到 10 的随机整数,大小为 7 x 4 x 24 长,然后使用 sub2indndgrid。您当然可以使用 randi,正如您在 cmets 中提到的那样。

我们将使用ndgrid 生成一个 3D 坐标网格,然后使用我们生成的随机整数来访问第四维。鉴于您的 4D 矩阵存储在 A 中,请执行以下操作:

rnd = randi(size(A,4), size(A,1), size(A,2), size(A,3));
[R,C,D] = ndgrid(1:size(A,1), 1:size(A,2), 1:size(A,3));
ind = sub2ind(size(A), R, C, D, rnd);
B = A(ind);

请记住,上述代码适用于任何 4D 矩阵。第一行代码在[1,10] 之间生成一个 7 x 4 x 24 的随机整数矩阵。接下来,我们生成空间坐标的 3D 网格,然后使用sub2ind 生成列主索引,我们可以从矩阵A 中采样,这样矩阵A 的每个唯一 3D 空间位置仅采样从一大块,只有一大块。然后,我们使用这些列主索引从A 中进行采样,以生成我们的输出矩阵B

【讨论】:

  • 令人印象深刻,问题标记为收藏,因此我可以参考。
【解决方案2】:

如果不使用循环,这个问题可能无法解决。一种可行的方法是:

mainMatrix = ... (7x4x24x10 matrix)
randMatrix = zeros(mainMatrix(:,1,1,1), mainMatrix(1,:,1,1), mainMatrix(1,1,:,1))
for x = 1:length(mainMatrix(:,1,1,1))
  for y = 1:length(mainMatrix(1,:,1,1))
    for z = 1:length(mainMatrix(1,2,:,1))
      randMatrix(x,y,z) = mainMatrix(x,y,z,randi(10))
    end
  end
end

【讨论】:

  • 没有循环肯定是可以解决的。看我的回答。但是,我承认它有点占用内存。如果矩阵非常大并且内存占用非常小,这将起作用。