快速从大文本文件中形成矩阵

时间:2013-04-20 08:28:59

标签: algorithm matlab file-io matrix

您好我正在努力从文件中快速读取数据。 (目前停留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中做得更快吗?

感谢

1 个答案:

答案 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

编辑 - 1

在查看了您的数据之后,即使您正确地修改了此代码,您也可能没有足够的内存来执行它,因为矩阵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

编辑 - 2

我不确定为什么它不适合你。这是我如何做的屏幕截图,如果有帮助:

enter image description here

编辑 - 3

当我获得double时,您似乎在B中获得了struct矩阵。我不确定为什么会这样;我只能推测您在使用importdata之前删除了输入文件中的标题行。

基本上只是我的B.data与您的B相同。因此,您应该能够使用以下内容:

>> A = sparse(B(:,1),B(:,2),1,max(max(B)),max(max(B)));