[英]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
您可以像使用功能str2num
和str2double
。 由于tline
是在这种情况下一个整数的空间分隔的字符数组, str2num
是最容易使用的计算C
:
C = str2num(tline);
然后你只需要像数组而不是单元格数组索引C
:
mat(C(1), C(2)) = 1;
额外的花絮:如果你想知道你的演示代码如何仍然有效,即使C
包含字符,这是因为MATLAB倾向于自动将变量转换为某些操作的正确类型。 在这种情况下,字符被转换为它们的双 ASCII码等价物: '1'
变为49
, '2'
变为50
等等。然后它将这些用作mat
索引。
你甚至不必费心上面的所有混乱,因为你可以使用dlmread
和sparse
的更简单的方法替换你的整个函数,如下所示:
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.