如何将稀疏矩阵写入文本文件

时间:2014-02-23 18:07:23

标签: matlab

我想在文本文件中写一个稀疏矩阵。假设我的稀疏矩阵是AA的第一行在第10,11个索引处具有非零值。第二行在第1,2个索引处具有非零值。然后,当我将数据写入文本文件时,它应该看起来像这样

10 11
1 2
......
....

我怎样才能在MATLAB中做到这一点?

2 个答案:

答案 0 :(得分:0)

第一篇文章,所以不确定是否允许发布代码,但也许这就是您要找的内容?

[rows, cols] = size(A);
outFile = fopen('sparse.txt', 'a');
for m = 1:rows
    n = 1;
    while n <= cols
        if A(m, n) ~= 0
            fprintf(outFile, '%d ', A(m, n));
        end
        n = n+1;
    end
    fprintf(outFile, '\r\n');
end

答案 1 :(得分:0)

鉴于这些限制,我只能看到给定格式的一个合理选项:

f = fopen('out.txt', 'w');
for ii=1:size(mat, 1)
    fprintf(f, '%u ', find(mat(ii, :));
    fprintf(f, '\n');
end
fclose(f);

由于每行的元素数量不是常数,这意味着两件事:

  • 我们不能构造一个矩阵来传递给矢量化函数,因此我们坚持使用某种形式的每行操作。
  • 我们也无法为fprintf提供一个常量格式字符串来在一次调用中写入一个或多个整行,因此我们遇到了多次fprintf次调用。

因此,优化这些约束;

  • 直接迭代行 - 是的,我们可以使用find同时提取行和列索引,但是我们浪费了内存来有效地复制整个数据集,我们仍然必须以某种方式迭代。
  • 最大限度地减少高级别工作量 - 让find和向量化fprintf的低级内部至少尽可能快地处理单行。

有时一个简单的循环确实是最好的选择 - 无论如何它都可能是I / O绑定的,所以与最小数量的fprintf调用相比,循环本身的开销实际上应该可以忽略不计。 / p>