MATLAB 索引问题

Posted

技术标签:

【中文标题】MATLAB 索引问题【英文标题】:MATLAB indexing question 【发布时间】:2011-06-18 01:40:19 【问题描述】:

我有一个矩阵,例如

A = [ 1 2 3; 4 5 6; 7 8 9] ;

和一个大小为 1x3 的向量,它指定每行中的哪个元素是我要查找的元素 - 即如果

vector = [ 1 2 1 ]

那么想要的输出是

[ 1 5 7 ]

因为1 是第 1 行中的第 1 个元素,5 是第 2 行中的第 2 个元素,7 是第 3 行中的第 1 个元素排。

我如何实现这一目标?找不到执行此操作的内置函数,这让我很惊讶。

【问题讨论】:

相关:Accessing values using subscripts without using sub2ind 【参考方案1】:

这是Yochai's answer 的变体,但没有转置(这也是SUB2IND 在Amro's answer 中所做的基本操作):

 output = A((1:3)+3.*(vector-1));

或者对于任意大小的数组A

 nRows = size(A,1);
 output = A((1:nRows)+nRows.*(vector-1));

【讨论】:

【参考方案2】:

MATLAB 提供 SUB2IND 函数将行/列下标转换为线性索引:

>> A = [1 2 3; 4 5 6; 7 8 9];
>> idx = sub2ind(size(A),1:3,[1 2 1]);  %# rows: [1 2 3], cols: [1 2 1]
>> A(idx)
     1     5     7

【讨论】:

【参考方案3】:

有点难看,但diag(A(1:3,[1 2 1])) 可以解决问题。

【讨论】:

我做了同样的事情:diag(A(:,vector))'【参考方案4】:

首先,Matlab 中的索引是从上到下的。 所以在你的情况下 A[1] = 1 , A[2] = 4 , A[3] = 7

也就是说,在 A' 上工作会更容易,因为它更简单。

B = A';

B((vector + [0:2].* 3))

【讨论】:

来自文档:“A(:)是A的所有元素,被视为一个列。”。作为旁注,以了解索引。

以上是关于MATLAB 索引问题的主要内容,如果未能解决你的问题,请参考以下文章

Matlab:汉明权重的索引数组

(Matlab) 使用 min 函数返回的索引进行维度索引

我的 Matlab 代码有啥问题?索引超出范围[关闭]

MATLAB:无法调用或索引到临时数组[重复]

转换向量索引超出数组边界 - matlab

MATLAB中索引的累积和