2015-10-20 72 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