【发布时间】: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),但它没有按我的需要工作。
【问题讨论】:
我有矩阵 A 和一个向量 b,它指定要为矩阵的每个对应行提取的元素的列索引。
例如,
A = [1 2 3
4 5 6
7 8 9]
b = [1 3 2]'
我想在输出时使用c = [1 6 8]'。如何做到这一点?
我尝试了A(:, b),但它没有按我的需要工作。
【问题讨论】:
可能有更优雅的解决方案,但这可行:
b = [1 3 2]';
[rows, cols] = size(A);
A(sub2ind([rows cols], [1 : rows]', b))
【讨论】:
()时避免使用[],因为它会导致对horzcat和vertcat的不必要调用(我预计)。
[] 是“这里的任何东西都是一个数组”。我知道这不是技术上的事实,但这是我在阅读/编写代码时的想法。我假设您的意思是[1 : rows]' 可能是(1 : rows)'。在我(公认有缺陷的)正在发生的事情的心理模型中,我说“我想要一个从 1 到行的列向量”。似乎操作顺序是这样的,那里不会有对 horzcat 的调用?即,我们得到类似temp1 = 1 : rows、temp2 = [temp1](没有horzcat b/c 只有一个对象)、temp3 = temp2'。
o,并且你写了[o],那么它将调用horzcat 和vertcat 方法。此外,无论如何,通常都值得遵循 M-Lint 的建议。
[1 : 10].'、(1 : 10).' 和 [(1 : 10).']。我在调用每个函数 100,000 次的脚本上运行分析器。 [(1 : 10).'] 实际上一直是最快的,大约 0.1 秒。(?!)显然这一点也不严谨,但 对我来说这个故事的寓意是 [1 : N] 的可读性值得微小的性能损失(至少对于 N 相当小)。当然,仅代表我自己发言。
作为@dantswain 解决方案的替代方案,您可以直接转到线性索引,假设您总是从列中进行选择:
r = size(A,1);
A( (1:r).' + (b-1) * r)
这样会更快,但不一定更清晰。
很遗憾,没有一个优雅的解决方案。
【讨论】: