MATLAB索引问题

发布于 2024-10-15 03:15:07 字数 363 浏览 1 评论 0原文

例如,我有一个矩阵

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

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

vector = [ 1 2 1 ]

那么所需的输出是

[ 1 5 7 ]

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

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

I have a matrix, for example

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

and a vector of size 1x3 which specifies which element in each row is the one I'm looking for - i.e. If

vector = [ 1 2 1 ]

then the desired output is

[ 1 5 7 ]

since 1 is the 1'st element in the 1'st row, 5 is the 2'nd in the 2'nd row, and 7 is the 1'st element in the 3'rd row.

How do I achieve this? Couldn't find a built in function to do this, which surprised me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

香草可樂 2024-10-22 03:15:07

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

MATLAB provides the SUB2IND function to convert rows/columns subscripts to linear indices:

>> 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
紫轩蝶泪 2024-10-22 03:15:07

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

这就是说,处理 A' 会更容易,因为它有点微不足道。

B = A';

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

First of all, the indexes in Matlab go from top to bottom.
So in your case A[1] = 1 , A[2] = 4 , A[3] = 7

That said, it would be easier to work on A' , because its a bit more trivial.

B = A';

B((vector + [0:2].* 3))
没︽人懂的悲伤 2024-10-22 03:15:07

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

It's a bit ugly, but diag(A(1:3,[1 2 1])) will do the trick.

无妨# 2024-10-22 03:15:07

这是 Yochai 的答案的变体,但没有转置(这基本上也是SUB2INDAmro 的回答):

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

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

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

Here's a variation of Yochai's answer but without the transpose (this is also basically what SUB2IND does in Amro's answer):

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

Or for an array A of an arbitrary size:

 nRows = size(A,1);
 output = A((1:nRows)+nRows.*(vector-1));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文