繁体   English   中英

Matlab从文本文件到稀疏矩阵。

[英]Matlab from text file to sparse matrix.

我有一个巨大的文本文件,格式如下:

1   2
1   3
1   10
1   11
1   20
1   376
1   665255
2   4
2   126
2   134
2   242
2   247

第一列是x坐标,第二列是y坐标。 它表明如果我必须构建一个矩阵

M = zeros(N, N);
M(1, 2) = 1;
M(1, 3) = 1;
.
.
M(2, 247) = 1;

此文本文件很大,无法立即进入主内存。 我必须逐行阅读。 并将其保存在稀疏矩阵中

所以我需要以下功能:

function mat = generate( path )
    fid = fopen(path);
    tline = fgetl(fid);
    % initialize an empty sparse matrix. (I know I assigned Mat(1, 1) = 1)
    mat = sparse(1);
    while ischar(tline)
        tline = fgetl(fid);
        if ischar(tline)
            C = strsplit(tline);
        end
        mat(C{1}, C{2}) = 1;
    end
    fclose(fid);
end

但不幸的是,除了第一排,它只是把垃圾放在我的稀疏垫子里。 演示:

1 7
1 9
2 4
2 9

如果我打印稀疏垫我得到:

   (1,1)        1
  (50,52)       1
  (49,57)       1
  (50,57)       1

有什么建议 ?

修复你拥有的......

您的问题是C字符的单元格数组,而不是数字。 您需要将从文件中读取的字符串转换为整数值。 取而代之的strsplit您可以像使用功能str2numstr2double 由于tline是在这种情况下一个整数的空间分隔的字符数组, str2num是最容易使用的计算C

C = str2num(tline);

然后你只需要像数组而不是单元格数组索引C

mat(C(1), C(2)) = 1;

额外的花絮:如果你想知道你的演示代码如何仍然有效,即使C包含字符,这是因为MATLAB倾向于自动将变量转换为某些操作的正确类型。 在这种情况下,字符被转换为它们的 ASCII码等价物: '1'变为49'2'变为50等等。然后它将这些用作mat索引。


更简单的替代方案......

你甚至不必费心上面的所有混乱,因为你可以使用dlmreadsparse的更简单的方法替换你的整个函数,如下所示:

data = dlmread(filePath);
mat = sparse(data(:, 1), data(:, 2), 1);
clear data;  % Save yourself some memory if you don't need it any more

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM