假设一个三维矩阵:
>> a = rand(3,4,2)
a(:,:,1) =
0.1067 0.7749 0.0844 0.8001
0.9619 0.8173 0.3998 0.4314
0.0046 0.8687 0.2599 0.9106
a(:,:,2) =
0.1818 0.1361 0.5499 0.6221
0.2638 0.8693 0.1450 0.3510
0.1455 0.5797 0.8530 0.5132
我使用线性索引一次有很多元素:
>> index1 = [1 ; 2 ; 1 ; 3];
>> index2 = [1 ; 4 ; 2 ; 3];
>> index3 = [1 ; 1 ; 2 ; 1];
>> indices = sub2ind(size(a), index1, index2, index3)
>> a(indices)
ans =
0.1067
0.4314
0.1361
0.2599
我想做同样的事情,把第一维的所有值都归还。此尺寸的大小可能会有所不同。在这种情况下,返回应该是:
>> indices = sub2ind(size(a), ??????, index2, index3);
>> a(indices)
ans =
0.1067 0.9619 0.0046 % a(:,1,1)
0.8001 0.4314 0.9106 % a(:,4,1)
0.1361 0.8693 0.5797 % a(:,2,2)
0.0844 0.3998 0.2599 % a(:,3,1)
在MatLab中以任何方式做到这一点?
答案 0 :(得分:2)
ind1 = repmat((1:size(a,1)),length(index2),1);
ind2 = repmat(index2,1,size(a,1));
ind3 = repmat(index3,1,size(a,1));
indices = sub2ind(size(a),ind1,ind2,ind3)
indices =
1 2 3
10 11 12
16 17 18
7 8 9
a(indices)
ans =
0.1067 0.9619 0.0046
0.8001 0.4314 0.9106
0.1361 0.8693 0.5797
0.0844 0.3998 0.2599
答案 1 :(得分:1)
您可以通过对与前两个维度分开的最后两个维度进行线性索引来获得所需的结果。即使在您期望a(:,:,:)
引用的3d数据块中,您也可以a(:)
(如您所知)或 a(:,:)
引用。以下代码查找最后两个维度的sub2ind,然后使用meshgrid
重复它们。这最终与@tmpearce提出的解决方案非常相似,但明确显示了半直线索引并使用meshgrid
而不是repmat
:
dim1 = 3;
dim2 = 4;
dim3 = 2;
rand('seed', 1982);
a = round(rand(dim1,dim2,dim3)*10)
% index1 = :
index2 = [1 ; 4 ; 2 ; 3];
index3 = [1 ; 1 ; 2 ; 1];
indices = sub2ind([dim2 dim3], index2, index3)
a(:, indices) % this is a valid answer
[X,Y] = meshgrid(1:dim1, indices)
indices2 = sub2ind([dim1, dim2*dim3], X,Y);
a(indices2) % this is also a valid answer, with full linear indexing