我有矩阵A和向量b,它指定矩阵的每个相应行中要提取的元素的列索引。如何在Matlab中从矩阵中提取非垂直列
例如,
A = [1 2 3
4 5 6
7 8 9]
b = [1 3 2]'
我想对产出c = [1 6 8]'
。如何实现这一目标?
我试过A(:, b)
,但它不起作用,因为我需要。
我有矩阵A和向量b,它指定矩阵的每个相应行中要提取的元素的列索引。如何在Matlab中从矩阵中提取非垂直列
例如,
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'(我期望)。 – Nzbuu
有趣。我总是把'[]'想象成“这里是一个数组”。我知道这不是技术上的真相,但是这正是我读/写代码时的想法。我假设你的意思是'[1:rows]'可以是'(1:rows)'。在我发生的事情的心理模型中(我承认有缺陷),我在说“我想要一个从1到行的列向量”。似乎操作的顺序会是这样,那里不会有电话给horzcat吗?也就是说,我们得到'temp1 = 1:rows','temp2 = [temp1]'(没有horzcat b/c只有一个对象),'temp3 = temp2''。 – dantswain
TBH,我不确定这种情况下MATLAB语法分析器有多聪明。当然,如果你有一个对象,'o',并且你写'[o]',那么它会调用horzcat和vertcat方法。此外,无论如何,通常都值得遵循M-Lint的建议。 – Nzbuu
作为替代@ dantswain的解决方案,你可以去线性指标直接,假设你总是从列选择:
r = size(A,1);
A((1:r).' + (b-1) * r)
这会更快,但不一定更清楚。
不幸的是,没有一个优雅的解决方案。
[MATLAB索引问题]可能的重复(http://stackoverflow.com/questions/4842512/matlab-indexing-question) – Amro