Algorithm 从一个大的文本文件快速形成一个矩阵

Algorithm 从一个大的文本文件快速形成一个矩阵,algorithm,matlab,file-io,matrix,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;

嗨,我正在努力从文件中快速读取数据。(目前停留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
我的实际文件有280000000个链接,这个代码对于这个大小的文件来说太慢了。有人知道在matlab中实现这一点要快得多吗


谢谢

您可以按照以下方式进行操作:

>> 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)));
这是我推荐的方法,因为
矩阵的大小为
[281903281903]
,由于内存限制,通常太大而无法处理。另一方面,
sparse
矩阵只维护那些非零的矩阵项,因此节省了大量空间。在大多数情况下,可以像使用普通矩阵一样或多或少地使用稀疏矩阵

提供了有关
sparse
命令的更多信息

编辑-2 我不知道为什么它对你不起作用。下面是我如何做的屏幕截图,以防有所帮助:

编辑-3 看起来你在
B
中得到了一个
double
矩阵,而我得到了一个
struct
。我不知道为什么会这样;我只能推测您在使用
importdata
之前删除了输入文件的标题行

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

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

你试过文本扫描吗?
sub2ind
实际上做什么?@noufal:它将下标转换成线性索引。例如,对于
4
行和
5
列的矩阵
A
,由于MATLAB以列主形式存储数据,
A(1,1)
A(1)
相同,
A(2,1)
A(2)
相同,
A(1,2)
A(5)
相同,依此类推,roney:尝试引用非结构数组的字段。错误==>在5 A处读取(sub2ind(大小(A),B.data(:,1),B.data(:,2))=1;它需要是一个方形矩阵,表示文件的链接结构,而不是(4,5)矩阵roney。我不知道它到底有多大,但大约2.8m。尝试参考非结构数组的字段。==>在5 A处读取时出错(sub2ind(大小(A),B.data(:,1),B.data(:,2))=1
>> A = sparse(B(:,1),B(:,2),1,max(max(B)),max(max(B)));