Matlab学习笔记 sparse与full函数

本文介绍了MATLAB中处理稀疏矩阵的sparse和full函数。sparse函数用于将稀疏矩阵转换为节省空间的形式,而full函数则将其转换回完整矩阵形式。文章通过实例展示了这两种函数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)sparse函数
sparse函数的功能就是把以第一种存储形式存储的稀疏矩阵转换成第二种形式存储。对应的函数为 full,即把以第二种方式存储的稀疏矩阵转换成第一种方式存储。
在MATLAB中,存储一个稀疏矩阵有两种方法。
语法格式:
1. S = sparse(A)
2. S = sparse(i,j,s,m,n,nzmax)
3. S = sparse(i,j,s,m,n)
4. S = sparse(i,j,s)
5. S = sparse(m,n)
程序示例:
1. >> A = 
[0, 0, 0, 0;
0, 0, 1, 0;
0, 0, 0, 0;
0, 1, 0, 2];
>> sparse(A)
ans =
(4,2) 1
(2,3) 1
(4,4) 2
2.S = sparse(i,j,s,m,n,nzmax)
由向量i,j,s 生成一个m*n,且最多含有nzmax个元素的稀疏矩阵。
sparse([1,2,3,4],[1,2,3,4],[0,0,1,1],5,5,6)
ans =
(3,3) 1
(4,4) 1
其中i=[1,2,3,4],对应要形成矩阵的行位置;
J=[1,2,3,4],对应要形成矩阵的列位置;
S=[0,0,1,1],对应要形成矩阵对应位置的值。
i 和j 的位置为一一对应,即(1,1)(2,2)(3,3)(4,4),将s中的值赋给这四个坐标的位置。
若i=[2,1,3,4],j=[3,2,4,1],则形成的坐标为(2,3)(1,2)(3,4),(4,1)  )
(m>=max(i),n>=max(j) , m和n的值可以在满足条件的范围内任意选取. nzmax>=max(i or j) )
下面为一些简化的情况
3.S = sparse(i,j,s,m,n)
  
用 nzmax = length(s) ;
4.S = sparse(i,j,s)
使m = max(i) 和 n = max(j),在s中零元素被移除前计算最大值,[i j s]中其中一行可能为[m n 0];
5.S = sparse(m,n)
sparse([],[],[],m,n,0)的缩写,生成一个m*n的所有元素都是0的稀疏矩阵。

(2)full函数
full函数功能:在MATLAB中,该函数用于把一个 稀疏矩阵sparse matrix)转换成一个全矩阵(full matrix)(关于sparse matrix和full matrix请参阅 sparse)。在matlab中,  meshgrid函数的 源代码调用了该函数。在MATLAB命令窗口中键入doc full或help full可以获得该函数的帮助信息。
语法格式:
A = full(S)
稀疏矩阵S转换成全矩阵。如果S是一个全矩阵,S将原封不动地被返回。如果A是一个全阵, issparse(A)为0。假设x是一个m乘以n的矩阵,其中包含nz = nnz(x)个非零项。那么,如果以全矩阵方式存储x,即full(x),需要占用m*n个实数大小的内存空间;而 sparse稀疏矩阵形式存储,即sparse(x),需要内存空间来存储nz个实数和nz+n个整数。在大多数计算机上,一个实数占用的内存空间为一个整数的两倍。在这些电脑上,如果比值nnz/prod(size(x))不超过三分之一,以 稀疏矩阵形式 存储一个矩阵所占用的 存储空间要远远少于以全矩阵形式存 储。然而,针对 稀疏矩阵 的运算过程要(比针对全矩阵的运算)花费更长的时间。所以,在使用 稀疏矩阵 形式存储一个矩阵时,这个比值最好不超过三分之二。
程序示例:
A = [0, 0, 0; 0, 1, 0; 1, 0, 0];
S =  sparse(A)
A = full(S)
输出结果:
>>  S =
(3,1) 1
(2,2) 1
A =
0 0 0
0 1 0
1 0 0
由此可以看出,所谓 稀疏矩阵存储形式,全矩阵存储形式,只是matlab中存储稀疏矩阵的两种不同的方式。前一种存储方式,只存储系数矩阵中的非零项的值和它在矩阵中的行列下标,而以全矩阵形式存储,则所有0也单独存储。

(3)以下为一例子:
>>A =
3
     3
     2
     1
     1
     2
     1
     2
     4
     1
>>B = full(sparse(A,1:size(A,1),1))
>>B =

     0     0     0     1     1     0     1     0     0     1
     0     0     1     0     0     1     0     1     0     0
     1     1     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     1     0

参考:http://baike.baidu.com/view/7978188.htm?fr=aladdin
http://baike.baidu.com/view/1126632.htm?fr=aladdin
### 如何在 MATLAB 中使用 `sparse` 函数 #### 创建稀疏矩阵的方法 可以通过多种语法格式来创建稀疏矩阵: - **从满矩阵转换** 当有一个已有的满矩阵A时,可以将其转化为稀疏矩阵S。 ```matlab S = sparse(A); ``` 此命令会检查输入矩阵A中的零元素,并仅保存非零元素及其位置信息以形成新的稀疏表示形式[^1]。 - **指定行列索引和值向量** 对于更复杂的场景,可以直接通过提供行索引i、列索引j以及对应的非零元素s来定义一个m×n大小的稀疏矩阵。 ```matlab S = sparse(i, j, s, m, n); ``` 这里的参数分别代表了各个非零项的位置坐标数值。注意,如果某个位置被多次赋值,则最终保留最后一次给出的那个值;而未提及到的地方默认视为0。 - **预分配空间并初始化为空** 有时为了提高效率,在事先知道最大可能存在的非零元数量的情况下,还可以预先设定好额外的空间大小nzmax用于加速后续操作。 ```matlab S = sparse(i, j, s, m, n, nzmax); ``` 这有助于减少因动态调整内部结构所带来的开销,特别是在逐步填充大型稀疏数组的过程中显得尤为重要。 - **生成全零稀疏矩阵** 另外也支持快速建立仅有特定尺寸却没有任何实际数据成员的对象实例。 ```matlab S = sparse(m, n); ``` 上述语句将会返回一个m*n规格下完全由空白占据的结果集,适用于作为模板或占位符等待后期更新具体内容。 #### 示例代码展示 下面是一些具体的例子用来说明怎样利用`sparse()`函数构建不同类型的稀疏矩阵: ```matlab % 将现有稠密矩阵转为稀疏型态 A = [0 0 1; 2 0 0; 0 3 0]; SA = sparse(A); % 使用三元组列表构造自定义模式下的稀疏对象 rowIdx = [1; 2; 3]; % 行号序列 colIdx = [3; 1; 2]; % 列号序列 values = [1; 2; 3]; % 非零元素集合 szRow = 3; szCol = 3; SB = sparse(rowIdx, colIdx, values, szRow, szCol); disp('原始矩阵:'); disp(full(SA)); disp('基于三元组创建的稀疏矩阵:'); disp(full(SB)); ``` 这段脚本首先展示了如何将常规二维表单简化成紧凑表达方式,接着又示范了一种更为灵活的手动组装途径——即依据给定的一系列离散点来拼接出目标图形轮廓。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值