Algorithm 从一个大的文本文件快速形成一个矩阵
嗨,我正在努力从文件中快速读取数据。(目前停留4小时,然后坠毁)必须是一种更简单的方法 文本文件类似于以下内容: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;
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)));