尝试将3d矩阵分配给2d矩阵时的索引错误

时间:2017-01-10 16:23:33

标签: matlab indexing

我有一个大小为A

的3d矩阵128 x 15 x 2

我有另一个大小为M

的2d列矩阵128 x 1

M只有2个可能的值,12,应从深度索引128 x 15或深度索引{{1}中选择1数据} 2,一次一行向量&将其存储在矩阵A中,该矩阵也是B

我不想使用1到128之间的for循环&根据相应的128 x 15值,从3d矩阵深度0或1中选择128行向量。

我想在一个赋值语句中执行此操作,但我无法这样做,因为它给了我错误的索引和&尺寸不匹配。
我试过了

M

然而,它生成了一个B = A(:, :, M) 3d矩阵,这并不是我所期待的。如何以我想要的方式索引矩阵。

2 个答案:

答案 0 :(得分:4)

这是因为您选择整个 3D"切片"对于M中的每个值,因为您已将其用作第三维的索引。

例如,如果M = [1 2 1],您将获得3个3D"切片"它分别由第一个,第二个和第一个切片组成。

相反,你可能想要类似下面的内容

% Shift the dimensions around a bit to bring the third dimension to the front
B = permute(A, [3 1 2]);

% Convert 1:numel(M) and M to linear indices
inds = sub2ind([size(B, 1), size(B, 2)], M, (1:numel(M)).');

% Reshape your matrix to be (128 * 2) x 15
C = reshape(B, [], size(B, 3));

% Index into this using the linear indexes computed above
output = C(inds, :);

答案 1 :(得分:2)

我认为有一种简单的方法可以实现你想要的。首先让我们生成您的数据:

A = rand(128, 15, 2);
M = [ones(64,1); 2*ones(64,1)];
M = M(randperm(128),1);

然后,您只需使用逻辑索引即可使用A索引M

B = zeros(128,15);
B(M == 1,:) = A(M == 1,:,1);
B(M == 2,:) = A(M == 2,:,2);

最后,您的结果位于B 128*15