假设我们有一个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循环的情况下生成相同的输出?
答案 0 :(得分:2)
这是一种方式:
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))
*编辑:这与内置函数的功能相同。
repmat([1:rows(test)]',1,columns(tidx))
然后我将2加在一起,并将它们用作测试的索引。