假设我们有一个2D(5x5)矩阵:
test =
39 13 90 5 71
60 78 38 4 11
87 92 46 45 35
40 96 61 17 1
90 50 46 89 63
第二个2D(5x2)矩阵:
tidx =
1 3
2 4
2 3
2 4
4 5
现在我们想使用tidx作为测试中的idex,这样我们就可以得到以下输出:
out =
39 90
78 4
92 46
96 17
89 63
一种方法是使用for循环。。。
for i=1:size(test,1)
out(i,:) = test(i,tidx(i,:));
end
问题:
有没有一种方法可以将其矢量化,从而在没有for循环的情况下生成相同的输出?
这里有一种方法:
test(repmat([1:rows(test)]',1,columns(tidx)) + (tidx-1)*rows(test))
你所描述的是一个索引问题。当你把一个矩阵都放在一个维度上时,你会得到
test(:) =
39
60
87
40
90
13
78
92
96
50
90
38
46
61
46
5
4
45
17
89
71
11
35
1
63
这可以使用单个数字进行索引。以下是如何将tidx转换为正确的格式。
首先,我使用上面的参考来计算索引编号,它们是:
outinx =
1 11
7 17
8 13
9 19
20 25
然后我开始尝试找出模式。这个计算提供了一个线索:
(tidx-1)*rows(test) =
0 10
5 15
5 10
5 15
15 20
这将把索引计数移动到测试的正确列。现在我只需要正确的一排。
outinx-(tidx-1)*rows(test) =
1 1
2 2
3 3
4 4
5 5
此模式由for循环创建。我用创建了这个矩阵
[1:rows(test)]' * ones(1,columns(tidx))
*EDIT:这对内置函数也起到了同样的作用。
repmat([1:rows(test)]',1,columns(tidx))
然后我把2加在一起,用它们作为测试的索引。