Matlab中随机select个4D矩阵的元素

Randomly select Elements of 4D matrix in Matlab

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

我有一堆 24 sheet 的 7x4 元素,我有 10 个这样的堆栈。我想要的是我得到一个 24 sheets 的 7x4 元素的堆栈,这样得到的单个堆栈中的每个元素都是从 10 个堆栈中完全相同的 sheet 数字中均匀随机抽取的.不使用循环怎么办?

如果我正确地解释了你想要的,对于这个 7 x 4 x 24 矩阵中的每个独特的 3D 位置,你想要确保我们从共享相同 3D 的 10 个堆栈中随机抽取一个空间位置.

我建议你做的是生成 1 到 10 的随机整数,大小为 7 x 4 x 24 长,然后使用 sub2ind along with ndgrid。您当然可以像评论中提到的那样使用 randi

我们将使用 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 矩阵。第一行代码生成一个 7 x 4 x 24 矩阵,其中包含 [1,10] 之间的随机整数。接下来,我们生成空间坐标的 3D 网格,然后使用 sub2ind 生成列主索引,我们可以在其中从矩阵 A 中采样,矩阵的每个唯一 3D 空间位置 A 仅从一个块中采样,并且只有一个块。然后我们使用这些列主索引从 A 中采样以生成我们的输出矩阵 B.

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

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