使用Matlab计算稀疏矩阵的特征向量

首先,说明下为什么要用MATLAB。原因是,支持稀疏矩阵的矩阵库比较少,即使支持去学习使用时间也更多。所以,就用MATLAB了。目的是使用MATLAB计算稀疏矩阵的特征向量,再用C++调用MATLAB代码。

问题1:如何定义稀疏矩阵。MATLAB使用sparse函数创建稀疏矩阵。如下调用:S = sparse(i,j,s,m,n),根据参数创建稀疏矩阵。i和j代表不为0元素的行和列值,s则是对应的值,m和n是矩阵的大小。当然还有其它接口,具体查阅MATLAB文档。

问题2:怎么计算稀疏矩阵的特征向量?MATLAB提供了eigs函数。其实,还有个eig函数,经本人实验,在使用C++调用MATLAB引擎的过程中,该函数失败了。那么,就只能使用eigs函数了。eigs函数有几种形式。下面说下我用到的几种形式。

形式1:d = eigs(A),返回的是稀疏矩阵A的特征值(所有的特征值构成一个向量d,本人的理解是没有保证d是有序的)。

形式2:d = eigs(A,k),返回的是最大的k个特征值,文档也没有说是有序的,如果设置k为1,那么返回的是最大的特征值。

形式3:[V,D] = eigs(A),V是特征向量构成的矩阵,每列是一个特征矩阵,D则是一个对角矩阵,对角线上的值是和V对应的特征值。不过,V和D的大小都固定为6。

形式4:[V,D] = eigs(A,k),则可以返回最大的k个特征向量和对应的特征值,但是也没有排序,需要根据D排序V,以方便使用。

问题3:如何实现返回k个根据特征值排序后的特征向量?这是最有价值的问题了。直接提供代码吧。

1
2
3
[V,D] = eigs(sm,k);
[newD,IX] = sort(diag(D)));;
newV=V(:,IX);

newV就是根据特征值排序后的特征向量,sm当然需要先建立了。
写在最后的话,之所以使用MATLAB计算稀疏矩阵的特征向量,是因为可以用C++调用。所以,关于这篇文章这些知识就够了,也算是我为自己做的整理吧。