2009-12-19 279 views
5

我想要在預定義位置獲得Matlab矩陣元素的矢量。例如,我有以下將matlab矩陣轉換爲矢量

>> i = [1,2,3]; 
>> j = [1,3,4]; 
>> A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

A = 

    1  2  3  4 
    5  6  7  8 
    9 10 11 12 
    13 14 15 16 

我希望有一個載體,這將使我的A值在correspongin到i,j的位置。我試過

A(i,j) 

ans = 

    1  3  4 
    5  7  8 
    9 11 12 

但這不是我想要的。我想獲得以下內容

>> [A(i(1),j(1)); A(i(2),j(2));A(i(3),j(3))] 

ans = 

    1 
    7 
    12 

這是什麼matlab語法?請避免提示循環或任何非矢量化形式的內容,因爲我需要快速完成此操作。希望會有一些內置功能。

回答

4

得到它的最快的方法,使用線性索引

A((j-1)*size(A,1)+i) 

記得MATLAB使用列優先的順序。

0

現在我使用的是這樣的:

>> diag(A(i,j)) 

ans = 

    1 
    7 
    12 
+3

雖然這樣做會起作用,但它通常是一個糟糕的選擇,因爲它首先在內存中創建一個新的3x3矩陣,然後使用diag函數將該矩陣的大部分放入位桶中。如果你的數組和(i,j)中的點列表都很大,那麼diag技巧將是非常低效的。 – 2009-12-19 12:08:34

3
A(sub2ind(size(A),i,j)) 

如果你真的渴望速度,你可以嘗試讓自己的sub2ind.m的副本剔除掉所有的輸入檢查該功能確實。

2

爲了理解如何做到這一點,最好理解matlab如何存儲它的數組。在矩陣中:

i = [1,2,3]; 
j = [1,3,4]; 
A = [1,2,3,4; 5,6,7,8; 9,10,11,12; 13,14,15,16] 

matlab存儲元素向下移動的列。所以它們實際上是按順序駐留在內存中的:

{1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16} 

實際上,您可以使用SINGLE索引來索引2-d數組。這就是爲什麼sub2ind技巧的作品。由於要得到的元素是1號,10號和15號元素,存儲在逐列排序,

singleIndex = [1 10 15]; 
A(singleIndex) 
ans = 
    1  7 12 

要確認sub2ind給該索引列表,嘗試...

ind = sub2ind([4 4],i,j) 
ind = 
    1 10 15