如果您的矩阵是稀疏的,那么当前存储它的方法(作为文本文件中的完整矩阵)似乎非常低效,并且肯定会使将其加载到 MATLAB 中变得非常困难。不过我怀疑只要足够稀疏,还是可以作为稀疏矩阵导入MATLAB的。
执行此操作的传统方法是一次加载所有内容,然后转换为稀疏表示。但是,在您的情况下,一次读取一行并动态转换为 MATLAB 稀疏矩阵是有意义的。
您可以通过估计矩阵的稀疏度来确定这是否可能,并使用它来查看是否可以将整个事物作为稀疏矩阵加载到 MATLAB 的内存中。
尝试类似:(未经测试的代码!)
% initialise sparse matrix
sparse_matrix = sparse(num_rows, num_cols);
row_num = 1;
fid = fopen(filename);
% read each line of text file in turn
while ~feof(fid)
this_line = fscanf(fid, '%f');
% add row to sparse matrix (note transpose, which I think is required)
sparse_matrix(row_num, :) = this_line';
row_num = row_num + 1;
end
fclose(fid)
% visualise using spy
spy(sparse_matrix)
可视化
关于可视化:通过imagesc 之类的工具可视化这样的稀疏矩阵是可能的,但我相信它可能会在内部创建完整的矩阵——也许有人可以确认这是否属实。如果是这样,那么它会导致你的记忆问题。
所有spy 真正做的是在二维中绘制非零元素的位置。您可以相当轻松地编写自己的 spy 函数,根据每个位置的值,它可以具有不同颜色或大小的点。有关示例,请参阅this answer。
保存稀疏矩阵
正如我上面所说,保存矩阵的方法效率很低——对于稀疏度为 10% 的矩阵,大约 95% 的文本文件将是零或空格。我不知道这些数据是从哪里来的,但是如果您对其创建有任何控制权(例如,它来自您编写的另一个程序),那么仅以 @ 格式保存非零元素会更有意义987654328@。
然后您可以使用spconvert 直接导入稀疏矩阵。