Matlab 尝试将三维矩阵指定给二维矩阵时出现索引错误

Matlab 尝试将三维矩阵指定给二维矩阵时出现索引错误,matlab,indexing,Matlab,Indexing,我有一个3d矩阵a,大小128 x 15 x 2 我还有一个2d列矩阵M,大小128 x 1 M只有两个可能的值,或者1或者2,它们应该从深度索引1或者A的深度索引2中选择128 x 15数据,一次一行向量并将其存储在矩阵B中,该矩阵也是128 x 15 我不想使用从1到128的for循环&根据相应的M值,从3d矩阵深度0或1中选择128行向量 我想在单个赋值语句中执行此操作,但无法执行,因为它给了我错误的索引和不匹配的维度。 我试过了 但是,它生成了一个128x15x1283d矩阵,这不是我所

我有一个3d矩阵
a
,大小
128 x 15 x 2

我还有一个2d列矩阵
M
,大小
128 x 1

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

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

我想在单个赋值语句中执行此操作,但无法执行,因为它给了我错误的索引和不匹配的维度。
我试过了


但是,它生成了一个
128x15x128
3d矩阵,这不是我所期望的。我怎样才能按照我想要的方式索引到矩阵中。

这是因为您为
M
中的每个值选择了一个完整的3D“切片”,因为您已经将其用作第三维的索引

例如,如果
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, :);

这是因为您为
M
中的每个值选择了一个完整的3D“切片”,因为您已经将其用作第三维的索引

例如,如果
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, :);

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

A = rand(128, 15, 2);
M = [ones(64,1); 2*ones(64,1)];
M = M(randperm(128),1);
然后,您可以使用
M
索引
A
,只需使用逻辑索引:

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

最后,您将在
B
中得到结果,即
128*15

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

A = rand(128, 15, 2);
M = [ones(64,1); 2*ones(64,1)];
M = M(randperm(128),1);
然后,您可以使用
M
索引
A
,只需使用逻辑索引:

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

最后,您在
B
中得到了结果,即
128*15

我还没有遇到您使用的任何函数。这是最简单的方法吗?是否可以不使用上述内置的functions@KharoBangdo不,不能。此外,如果您想在MATLAB中进行开发,则必须了解上述所有函数,才能编写高效的代码。你最好开始学习!我测试了上述4行代码。输出矩阵为128 x 2,而不是128 x 5。因此,请修改code@KharoBangdo很抱歉,这是我的错别字。它已经被更新了。这个解决方案也可以用+1,但是@hmofrad的答案可以减少20%的时间来执行我的代码。ThanksI还没有遇到您使用的任何函数。这是最简单的方法吗?是否可以不使用上述内置的functions@KharoBangdo不,不能。此外,如果您想在MATLAB中进行开发,则必须了解上述所有函数,才能编写高效的代码。你最好开始学习!我测试了上述4行代码。输出矩阵为128 x 2,而不是128 x 5。因此,请修改code@KharoBangdo很抱歉,这是我的错别字。它已经被更新了。这个解决方案也可以用+1,但是@hmofrad的答案可以减少20%的时间来执行我的代码。ThanksIt为B赋值提供了“下标赋值维度不匹配”错误。这是一个简单的解决方案。您得到的错误是因为维度错误,它应该是
A=rand(128,15,2)@Adiel,你说得对!我当时正在写一个小问题的解决方案
8*5*2
,我在发布答案时忘记了更改维度!它为B赋值提供了“下标赋值维度不匹配”错误。这是一个简单的解决方案。您得到的错误是因为维度错误,它应该是
A=rand(128,15,2)@Adiel,你说得对!我当时正在写一个小问题的解决方案
8*5*2
,我在发布答案时忘记了更改维度!