【问题标题】:Selecting elements from an array in MATLAB在 MATLAB 中从数组中选择元素
【发布时间】:2012-10-13 00:06:33
【问题描述】:

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

【问题讨论】:

  • 你可能想看看stackoverflow.com/questions/10146082/…,因为它涵盖了你遇到的同样的问题
  • 或者您可以查看here 看到基本相同的答案。
  • 感谢您指出;我搜索并只找到了逻辑索引的案例。

标签: arrays matlab indexing


【解决方案1】:

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

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 来提高可读性。

【讨论】:

  • 注意:Matlab 是基于 1 的,所以你必须使用m*(tuples(:,2)-1)。否则,这个解决方案比sub2ind 快大约 40 倍,所以它有我的偏好:)
  • @RodyOldenhuis 我也更喜欢这个。但是,为此,I previously got mildly criticizedsub2ind 是要走的路。有趣的是人们如何改变自己的想法:)
  • @angainor:嗯,有多少人就有多少意见。我只是想知道sub2ind 到底做了什么让它消耗这么多时间...你知道,我们应该启动一个新的工具箱,比如lightspeed,尤其是像这样的东西:)
  • @RodyOldenhuis 你知道故事是怎么回事:“...... MATLAB 必须处理一般情况,而你的情况很特殊,所以 MATLAB 当然可以更慢......”。但它更通用;)
【解决方案2】:

如果 x 和 y 是矩阵 a 的 x y 值的向量,那么 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

【讨论】:

  • 两种方法都不错。这个也无缝地适用于更高的维度,+1。虽然为了更快的执行,另一个更好。
【解决方案3】:

您可以使用 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]

返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-03
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    相关资源
    最近更新 更多