2011-10-11 54 views
1

我有矩阵A和向量b,它指定矩阵的每个相应行中要提取的元素的列索引。如何在Matlab中从矩阵中提取非垂直列

例如,

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

b = [1 3 2]' 

我想对产出c = [1 6 8]'。如何实现这一目标?

我试过A(:, b),但它不起作用,因为我需要。

+0

[MATLAB索引问题]可能的重复(http://stackoverflow.com/questions/4842512/matlab-indexing-question) – Amro

回答

2

有可能是一个更好的解决方案,但这个工程:

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

当你的意思是'()'时避免使用'[]',因为它会导致不必要的调用'horzcat'和'vertcat'(我期望)。 – Nzbuu

+0

有趣。我总是把'[]'想象成“这里是一个数组”。我知道这不是技术上的真相,但是这正是我读/写代码时的想法。我假设你的意思是'[1:rows]'可以是'(1:rows)'。在我发生的事情的心理模型中(我承认有缺陷),我在说“我想要一个从1到行的列向量”。似乎操作的顺序会是这样,那里不会有电话给horzcat吗?也就是说,我们得到'temp1 = 1:rows','temp2 = [temp1]'(没有horzcat b/c只有一个对象),'temp3 = temp2''。 – dantswain

+2

TBH,我不确定这种情况下MATLAB语法分析器有多聪明。当然,如果你有一个对象,'o',并且你写'[o]',那么它会调用horzcat和vertcat方法。此外,无论如何,通常都值得遵循M-Lint的建议。 – Nzbuu

2

作为替代@ dantswain的解决方案,你可以去线性指标直接,假设你总是从列选择:

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

这会更快,但不一定更清楚。

不幸的是,没有一个优雅的解决方案。