您好我正在努力从文件中快速读取数据。 (目前停留4小时,然后坠毁)必须更简单。
文本文件看起来像这样:
From To
1 5
3 2
2 1
4 3
由此我想形成一个矩阵,以便在[m,n]
中有一个1目前的代码是:
function [z] = reed (A)
[m,n]=size(A);
i=1;
while (i <= n)
z(A(1,i),A(2,i))=1;
i=i+1;
end
输出以下矩阵,z:
z =
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
我的实际文件有280,000,000个链接,此代码对于此大小的文件来说太慢了。有人知道在matlab中做得更快吗?
感谢
答案 0 :(得分:2)
您可以按照以下方式执行某些操作:
>> A = zeros(4,5);
>> B = importdata('testcase.txt');
>> A(sub2ind(size(A),B.data(:,1),B.data(:,2))) = 1;
我的测试用例'testcase.txt'
包含您的示例数据:
From To
1 5
3 2
2 1
4 3
结果将是:
>> A
A =
0 0 0 0 1
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
在查看了您的数据之后,即使您正确地修改了此代码,您也可能没有足够的内存来执行它,因为矩阵A
会变得太大。
因此,您可以使用sparse
矩阵来实现与下面相同的内容:
>> B = importdata('web-Stanford.txt');
>> A = sparse(B.data(:,1),B.data(:,2),1,max(max(B.data)),max(max(B.data)));
这将是我建议的方法,因为您的A
矩阵的大小为[281903,281903]
,由于内存限制,该大小通常太大而无法处理。另一方面,sparse
矩阵仅保留那些非零的矩阵条目,从而节省了大量空间。在大多数情况下,您可以使用稀疏矩阵或多或少使用普通矩阵。
有关sparse
命令的更多信息,请参阅here。
我不确定为什么它不适合你。这是我如何做的屏幕截图,如果有帮助:
当我获得double
时,您似乎在B
中获得了struct
矩阵。我不确定为什么会这样;我只能推测您在使用importdata
之前删除了输入文件中的标题行。
基本上只是我的B.data
与您的B
相同。因此,您应该能够使用以下内容:
>> A = sparse(B(:,1),B(:,2),1,max(max(B)),max(max(B)));