Matrix 矩阵与其他矩阵的矢量化索引(倍频程)

Matrix 矩阵与其他矩阵的矢量化索引(倍频程),matrix,indexing,octave,vectorization,Matrix,Indexing,Octave,Vectorization,假设我们有一个2D(5x5)矩阵: 以及第二个2D(5x2)矩阵: 现在我们想将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循环的情况下生成相同的输出?这里有一

假设我们有一个2D(5x5)矩阵:

以及第二个2D(5x2)矩阵:

现在我们想将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))
*编辑:这与内置函数的功能相同

repmat([1:rows(test)]',1,columns(tidx))

然后,我将这两个值相加,并将它们用作测试的索引。

CharityAbbott-非常感谢@user1672370如果有效,请接受此答案。除非您的问题特别需要一个正方形(即5x5)矩阵,否则最好使用一个不是完美正方形的矩阵来测试和提问。这样可以确保不会因意外交换行(测试)和列(测试)而混淆尺寸。它在测试一个方阵时不会出现。
[1:rows(test)]' * ones(1,columns(tidx))
repmat([1:rows(test)]',1,columns(tidx))