【问题标题】:Form a Matrix From a Large Text File Quickly快速从大文本文件形成矩阵
【发布时间】:2013-04-20 08:28:58
【问题描述】:

您好,我正在努力以足够快的速度从文件中读取数据。 (目前离开 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 中执行此操作要快得多吗?

谢谢

【问题讨论】:

  • 你试过 textscan 了吗?

标签: algorithm matlab file-io matrix


【解决方案1】:

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

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

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

编辑 - 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(size(A),B.data(:,1),B.data(:,2))) = 1;
  • 需要是方阵,表示文件的链接结构,而不是(4,5)矩阵roney。我不知道它到底有多大,但大约 2.8m。
  • 尝试引用非结构数组的字段。 ==> 在 5 A(sub2ind(size(A),B.data(:,1),B.data(:,2))) = 1 处读取错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2018-05-05
  • 1970-01-01
相关资源
最近更新 更多