You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从压缩列存储数组直接在MATLAB中创建稀疏矩阵?

直接利用MATLAB原生CCS支持创建稀疏矩阵

当然有更高效直接的方法!其实MATLAB的稀疏矩阵本身就是基于**压缩列存储(CCS)**实现的,所以你完全不需要先把CCS格式转成三元组再用spconvert,直接用sparse函数的重载版本或者直接操作稀疏矩阵的底层属性就能完成。

方法一:使用sparse函数的CCS专用重载

这个方法最稳妥,也是官方推荐的方式,只需要对原始的CCS数组做少量索引转换(因为MATLAB对外接口是1-based索引,而你的数据是0-based):

步骤1:准备并转换原始数据

你的原始数组是0-based的,先转成MATLAB接口需要的1-based格式:

% 原始CCS数据(0-based)
column_pointer = [0,3,6,8,10];
row_index = [0,1,3,1,2,3,0,2,1,3];
values = [4.0, 3.0, 3.0, 2.7, 1.8, 0.3, 3.2, 3.0, 0.1, 1.0];

% 转换为MATLAB接口的1-based索引
row_idx_1based = row_index + 1;
col_ptr_1based = column_pointer + 1;

步骤2:计算矩阵尺寸

从CCS数组推导矩阵的行数和列数:

num_rows = max(row_idx_1based);  % 最大行索引(1-based)就是总行数
num_cols = length(col_ptr_1based) - 1;  % 列指针数组长度减1就是列数

步骤3:直接创建稀疏矩阵

调用sparse的重载版本,传入CCS格式的参数:

A = sparse(row_idx_1based, [], values, num_rows, num_cols, col_ptr_1based);

运行后,用full(A)查看结果,就能得到对应的完整矩阵:

4.0   0.0   3.2   0.0
3.0   2.7   0.0   0.1
0.0   1.8   3.0   0.0
3.0   0.3   0.0   1.0

方法二:直接操作稀疏矩阵的底层属性

如果你了解MATLAB稀疏矩阵的内部存储结构,可以直接给底层的CCS数组赋值,跳过索引转换(因为MATLAB内部存储用的是0-based,和你的原始数据完全匹配):

% 原始CCS数据(0-based)
column_pointer = [0,3,6,8,10];
row_index = [0,1,3,1,2,3,0,2,1,3];
values = [4.0, 3.0, 3.0, 2.7, 1.8, 0.3, 3.2, 3.0, 0.1, 1.0];

% 计算矩阵尺寸
num_rows = max(row_index) + 1;
num_cols = length(column_pointer) - 1;

% 创建空稀疏矩阵,直接赋值底层CCS属性
A = sparse(num_rows, num_cols);
A.ir = row_index;    % 0-based行索引数组
A.jc = column_pointer;  % 0-based列指针数组
A.pr = values;       % 非零元素值数组

% 刷新矩阵状态(确保内部结构正确)
A = A(:);

这种方法更直接,不需要转换索引,但要注意:直接操作底层属性可能在MATLAB的不同版本中有细微变化,所以如果是生产环境代码,更推荐方法一。

为什么这个方法更好?

相比spconvert需要先生成三元组的列索引数组(每个非零元素都要对应列号),直接用CCS格式创建的方式:

  • 不需要额外的内存存储列索引数组,更节省空间
  • 避免了列索引的生成过程,效率更高
  • 完全契合MATLAB稀疏矩阵的原生存储逻辑,减少转换损耗

内容的提问来源于stack exchange,提问作者Morpheus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:27:39