【问题标题】:How to extract non-vertical column from matrix in Matlab如何从Matlab中的矩阵中提取非垂直列
【发布时间】:2011-12-04 23:52:12
【问题描述】:

我有矩阵 A 和一个向量 b,它指定要为矩阵的每个对应行提取的元素的列索引。

例如,

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

b = [1 3 2]'

我想在输出时使用c = [1 6 8]'。如何做到这一点?

我尝试了A(:, b),但它没有按我的需要工作。

【问题讨论】:

标签: matlab matrix-indexing


【解决方案1】:

可能有更优雅的解决方案,但这可行:

b = [1 3 2]';
[rows, cols] = size(A);
A(sub2ind([rows cols], [1 : rows]', b))

【讨论】:

  • 当你的意思是()时避免使用[],因为它会导致对horzcatvertcat的不必要调用(我预计)。
  • 有趣。我一直认为[] 是“这里的任何东西都是一个数组”。我知道这不是技术上的事实,但这是我在阅读/编写代码时的想法。我假设您的意思是[1 : rows]' 可能是(1 : rows)'。在我(公认有缺陷的)正在发生的事情的心理模型中,我说“我想要一个从 1 到行的列向量”。似乎操作顺序是这样的,那里不会有对 horzcat 的调用?即,我们得到类似temp1 = 1 : rowstemp2 = [temp1](没有horzcat b/c 只有一个对象)、temp3 = temp2'
  • TBH,我不确定 MATLAB 解析器在这种情况下有多聪明。当然,如果你有一个对象o,并且你写了[o],那么它将调用horzcatvertcat 方法。此外,无论如何,通常都值得遵循 M-Lint 的建议。
  • 旧习惯很难改掉 :) 我对这个很好奇,所以我做了一些分析。我编写了三个计算函数:[1 : 10].'(1 : 10).'[(1 : 10).']。我在调用每个函数 100,000 次的脚本上运行分析器。 [(1 : 10).'] 实际上一直是最快的,大约 0.1 秒。(?!)显然这一点也不严谨,但 对我来说这个故事的寓意是 [1 : N] 的可读性值得微小的性能损失(至少对于 N 相当小)。当然,仅代表我自己发言。
【解决方案2】:

作为@dantswain 解决方案的替代方案,您可以直接转到线性索引,假设您总是从列中进行选择:

r = size(A,1);
A( (1:r).' + (b-1) * r)

这样会更快,但不一定更清晰。

很遗憾,没有一个优雅的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多