我有一个尺寸为7x4x24x10的4D矩阵(让我们称之为main_mat)。我想得到一个大小为7x4x24(rand_mat)的矩阵,这样这个(rand_mat)矩阵的每个元素实际上都是来自主矩阵(main_mat)的均匀随机抽取。如果我没有清楚地提出问题,我很抱歉,所以我试着解释一下:
我有一堆24张7x4元素,我有10个这样的堆栈。我想要的是,我得到一叠24张7x4元素,这样一来,所得到的单个堆栈中的每个元素都是从10个堆栈中从完全相同的纸张编号中均匀地随机抽取出来的。如何在不使用循环的情况下完成?
答案 0 :(得分:4)
如果我正确解释你想要的东西,对于这个7 x 4 x 24矩阵中每个独特的3D位置,你要确保我们从共享相同3D空间位置的10个堆栈中的一个中随机抽样
我建议您做的是生成1到10个大小为7 x 4 x 24的随机整数,然后使用sub2ind
和ndgrid
。您可以在评论中提到amt
。
我们使用randi
生成3D坐标网格,然后使用我们生成的随机整数来访问第四维。鉴于您的4D矩阵存储在ndgrid
中,请执行以下操作:
A
请记住,上面的代码适用于任何 4D矩阵。第一行代码在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);
之间生成一个7 x 4 x 24的随机整数矩阵。接下来,我们生成一个空间坐标的3D网格,然后使用[1,10]
生成列主要索引,我们可以从矩阵sub2ind
中采样,其中矩阵的每个唯一3D空间位置{ {1}}只从一个块和一个块中采样。然后,我们使用这些列主要索引从A
进行采样,以生成输出矩阵A
。
答案 1 :(得分: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