矩阵与其他矩阵的矢量化索引(以八度为单位)

时间:2012-09-14 20:16:42

标签: matrix indexing octave vectorization

假设我们有一个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循环的情况下生成相同的输出?

1 个答案:

答案 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加在一起,并将它们用作测试的索引。