4

我知道在 MATLAB 中,在一维情况下,您可以选择具有索引的元素,例如a([1 5 3]), 以返回 a 的第一个、第五个和第三个元素。我有一个二维数组,想根据我拥有的一组元组选择单个元素。所以我可能想得到a(1,3), a(1,4), a(2,5)等等。目前我拥有的最好的是diag(a(tuples(:,1), tuples(:,2)),但是对于较大的 a 和/或元组,这需要大量的内存。我是否必须将这些元组转换为线性索引,或者是否有一种更简洁的方法可以在不占用太多内存的情况下完成我想要的操作?

4

3 回答 3

6

转换为线性索引似乎是一种合法的方式:

indices = tuples(:, 1) + size(a,1)*(tuples(:,2)-1);
selection = a(indices);

请注意,这也在 Matlab 内置解决方案中实现sub2ind,如 nate'2 答案:

a(sub2ind(size(a), tuples(:,1),tuples(:,2)))

然而,

a = rand(50);
tuples = [1,1; 1,4; 2,5];

start = tic;
for ii = 1:1e4
    indices = tuples(:,1) + size(a,1)*(tuples(:,2)-1); end
time1 = toc(start);


start = tic;
for ii = 1:1e4
    sub2ind(size(a),tuples(:,1),tuples(:,2)); end
time2 = toc(start);

round(time2/time1)

这使

ans =   
    38

所以虽然sub2ind在眼睛上更容易,但它也了约 40 倍。如果您必须经常进行此操作,请选择上述方法。否则,用于sub2ind提高可读性。

于 2012-10-23T05:25:00.987 回答
3

如果 x 和 y 是矩阵 a 的 xy 值的向量,那么 sub2und 应该可以解决您的问题:

a(sub2ind(size(a),x,y))

例如

a=魔法(3)

一个=

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


a(sub2ind(size(a),x,y))

ans =

 4     1
于 2012-10-23T05:35:39.230 回答
0

您可以使用 1D 数字引用 2D matlab 位置,如下所示:

a = [3 4 5;
     6 7 8;
     9 10 11;];
a(1) = 3;
a(2) = 6;
a(6) = 10;

因此,如果您可以像这样获得矩阵中的位置:

a([(col1-1)*(rowMax)+row1, (col2-1)*(rowMax)+row2, (col3-1)*(rowMax)+row3])

注意:在这种情况下,rowmax 为 3

将为您提供 col1/row1 col2/row2 和 col3/row3 的元素列表。

因此,如果

row1 = col1 = 1
row2 = col2 = 2
row3 = col3 = 3

你会得到:

[3, 7, 11]

背部。

于 2012-10-23T05:38:24.930 回答