【问题标题】:How to write a sparse matrix to a text file如何将稀疏矩阵写入文本文件
【发布时间】:2014-02-23 18:07:23
【问题描述】:

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

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

如何在 MATLAB 中做到这一点?

【问题讨论】:

  • 每行是否总是有相同数量的元素?如果没有,是否有空行?
  • 你不关心这些条目的实际值吗?
  • @LuisMendo。不,我不在乎实际值。
  • @Notlikethat。每行的元素数量可能不同

标签: matlab


【解决方案1】:

第一次发帖,所以不确定是否允许发布代码,但也许这就是你要找的?

[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

【讨论】:

【解决方案2】:

考虑到这些限制,对于给定的格式,我只看到一个明智的选择:

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 一次性提取行和列索引,但是我们浪费了内存有效地复制整个数据集,我们仍然 /em> 必须以某种方式对其进行迭代。
  • 尽量减少高级工作量 - 让 find 和矢量化 fprintf 的低级内部至少可以尽可能快地处理单行。

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

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2023-03-17
    • 1970-01-01
    • 2014-08-17
    • 2018-01-19
    • 1970-01-01
    • 2011-06-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多