1

假设一个 3-D 矩阵:

>> 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 中做到这一点?

4

2 回答 2

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
于 2012-06-29T20:51:52.823 回答
1

您可以通过对与前两个维度分开的最后两个维度进行线性索引来获得所需的结果。即使在您希望引用的 3d 数据块中,a(:,:,:)您也可以通过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
于 2012-06-29T21:09:01.273 回答