矩阵与其他矩阵的矢量化索引(八度音阶)



假设我们有一个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加在一起,用它们作为测试的索引。

最新更新