Matrix 矩阵与其他矩阵的矢量化索引(倍频程)
假设我们有一个2D(5x5)矩阵: 以及第二个2D(5x2)矩阵: 现在我们想将tidx用作测试中的idex,以便获得以下输出: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循环的情况下生成相同的输出?这里有一
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))