淘先锋技术网

首页 1 2 3 4 5 6 7

一般有两个命令可以用来创建稀疏矩阵:

1. sparse(较常用)

2. spdiags(主要用于非零元素都是对角线元素的情况)

sparse。使用格式如下

A = sparse( i,j,,s,m,n,nzmax )

其实matlab函数sparse的文档中说的比较明白:

S = sparse(i,j,s,m,n,nzmax) uses vectors i, j, and s to generate an m-by-n sparse matrix such that S(i(k),j(k)) = s(k), with space allocated for nzmax nonzeros. Vectors i, j, and s are all the same length.

主要意思:i, j, s都是向量,i,j分别为非零元素的行下标和列下标构成的列向量,i(k)和j(k)作为两个下标标记非零元素在矩阵中的位置,这个位置上的元素值为s(k).

比如要构造的系数矩阵A中A(3,5)=7,而7是A中第10个非零元素(第几个元素是按列来数的),则i(10)=3,j(10)=5,s(10)=7

构造举例:

i=[1 3 1 2 1 4];j=[1 1 2 2 3 4];s = [1 2 3 4 5 6];

>> sparse(i,j,s)

ans =

(1,1)        1

(3,1)        2

(1,2)        3

(2,2)        4

(1,3)        5

(4,4)        6

m,n表明A 是 m×n 阶矩阵(可省略);nzmax 用于指定A 中非零元素所用存储空间大小(可省略)。最简单的使用方式是只输入非零元的数据以及各非零元的行指标和列指标。例如,创建一个只有三个非零元的4×5阶矩阵可用下面命令

i=[1  2  4];j=[1  3  5];s = [6  7  8];

A = sparse(i,j,s)

MATLAB执行后,将显示出

A =

(1,1)        6

(2,3)        7

(4,5)        8

这是特殊的稀疏矩阵存储方式,它的特点是所占内存少,运算速度快。如果想得到矩阵的全元素存储方式,可用下面命令

B = full(A)

计算机运行后,将显示出

B =

6     0     0     0     0

0     0     7     0     0

0     0     0     0     0

0     0     0     0     8

当所要构造矩阵比较大,而非零元素的位置又比较有规律时,可以考虑用sparese函数,首先构造i,j,s  然后矩阵就可以自动生成了。

2. spdiags(适用于非零元素均在对角线上,且对角线元素比较有规律,容易构造),例如,创建一个三对角的10×10矩阵, 可用下面命令

e = ones (10,1); % e似乎必须写成n*1的形式

A = spdiags ([ e,4*e,e ],[-1,0,1],10,10);

% 头一个大括号分别对应是3个不同非零对角线元素,按从下往上排列;第二个大括号对应于每个对角线相对于中央对角线的位置

% 后面的两个数就是要构造的系数矩阵的行列数

B = full (A)

这里,A是稀疏矩阵存储的方式,B是全元素存储的方式

B =

4     1     0     0     0     0     0     0     0     0

1     4     1     0     0     0     0     0     0     0

0     1     4     1     0     0     0     0     0     0

0     0     1     4     1     0     0     0     0     0

0     0     0     1     4     1     0     0     0     0

0     0     0     0     1     4     1     0     0     0

0     0     0     0     0     1     4     1     0     0

0     0     0     0     0     0     1     4     1     0

0     0     0     0     0     0     0     1     4     1

0     0     0     0     0     0     0     0     1     4

再比如,我要构造图像处理中经常用到的梯度计算矩阵,要产生类似如下的

-1 -1 -1  1 1 1 0 0 0....

-1 -1 -1 1 1 1 0 0 0...

-1 -1 -1 1 1 1 0 0 0...

可以使用命令:

%假设图像大小为N=n*n,这里给一个粗略的构造,最后几位没有考虑,其实不会有太大影响

e = ones(N,1);

Dv = spdiags([(-1)*e,(-1)*e,(-1)*e,e,e,e],[0,1,2,3,4,5],N,N);

转自:http://blog.csdn.net/afgh2587849/article/details/6526042