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