2015-10-20 59 views
0

鉴于下面的4x6矩阵A创建基于行和列的下标新矩阵

A = [ 
10 11 12 13 14 15 
16 17 18 19 20 21 
22 23 24 25 26 27 
28 29 30 31 32 33 
]; 

和含有该行和列的下标(rc,分别地)两个变量:

r = [ 
1 1 1 
1 1 1 
3 3 3 
3 3 3 
4 4 4 
]; 

c = [ 
1 3 6 
1 2 4 
1 2 6 
1 4 5 
1 5 6 
]; 

我想创建一个新的5X3矩阵B这需要从r每一行和每一列的组合和c这样的:

B = [ 
10 12 15 
10 11 13 
22 23 27 
22 25 26 
28 32 33 
]; 

注意,元件B(1,1)通过使用r(1,1)作为行下标和c(1,1)作为列下标导出。元B(1,2)需要r(1,2)c(1,2)为行和列下标。等等...

我可以解决使用嵌套的for循环这个问题,但我工作的实际应用具有非常大的矩阵和这种方法导致显著的瓶颈。有没有更好的(阅读:更快)的选择?

for循环以供参考:

B = NaN(size(r,1),size(c,2)); 
for row=1:size(r,1) 
    for col=1:size(c,2) 
     B(row,col) = A(r(row,col),c(row,col)); 
    end 
end 

回答

4

是的,可以索引2D矩阵与单个索引值的列的串联 - 像通过翻转矩阵到载体柱逐柱。例如,您只需使用A(8)即可访问A(4,2)

因此,所有你需要做的是创建索引的一个新的矩阵,然后进入那些值:

% input data array 
A = [10 11 12 13 14 15; 
16 17 18 19 20 21; 
22 23 24 25 26 27; 
28 29 30 31 32 33]; 

% number of rows 
N_rows = size(A,1); 

% row indices 
r = [1 1 1; 
1 1 1; 
3 3 3; 
3 3 3; 
4 4 4]; 

% column indices 
c = [1 3 6; 
1 2 4; 
1 2 6; 
1 4 5; 
1 5 6]; 

% element indices 
idx = (c - 1)*N_rows + r; 

% new indexed array 
B = A(idx); 

% display outputs 
disp(B) 
0

可以使用sub2ind函数转换标(R,C),以线性指标('单一索引值')。

如果需要反向转换使用ind2sub。

+0

这是专用的路要走,但你至少应包括一些代码,使这个问题的答案upvoteworthy。这样它的评论。 – thewaywewalk