2

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

4

1 回答 1

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

于 2012-09-17T20:33:29.627 回答