2

嗨,我正在努力从文件中快速读取数据。(目前离开 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中这样做更快吗?

谢谢

4

1 回答 1

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提供了有关该命令的更多信息。

编辑 - 2

我不确定为什么它不适合你。这是我如何做到的截图,以防万一:

在此处输入图像描述

编辑 - 3

似乎你在得到一个double矩阵,B而我得到一个struct. 我不确定为什么会这样;我只能推测您在使用之前从输入文件中删除了标题行importdata

基本上只是我B.data的和你的一样B。因此,您应该能够改用以下内容:

>> A = sparse(B(:,1),B(:,2),1,max(max(B)),max(max(B)));
于 2013-04-20T08:51:25.107 回答