将matlab矩阵转换为矢量

问题描述:

我想要在预定义位置获得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语法?请避免提示循环或任何非矢量化形式的内容,因为我需要快速完成此操作。希望会有一些内置功能。

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

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

记得MATLAB使用列优先的顺序。

现在我使用的是这样的:

>> diag(A(i,j)) 

ans = 

    1 
    7 
    12 
+3

虽然这样做会起作用,但它通常是一个糟糕的选择,因为它首先在内存中创建一个新的3x3矩阵,然后使用diag函数将该矩阵的大部分放入位桶中。如果你的数组和(i,j)中的点列表都很大,那么diag技巧将是非常低效的。 – 2009-12-19 12:08:34

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

如果你真的渴望速度,你可以尝试让自己的sub2ind.m的副本剔除掉所有的输入检查该功能确实。

为了理解如何做到这一点,最好理解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