1

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

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

4

2 回答 2

4

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

我建议您做的是生成 1 到 10 的随机整数,大小为 7 x 4 x 24 长,然后sub2indndgrid. 你当然可以使用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

于 2015-06-20T23:44:13.250 回答
0

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

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
于 2015-06-20T23:48:24.770 回答