【问题标题】:How can I read data in particular format to a matrix in Matlab?如何将特定格式的数据读取到 Matlab 中的矩阵?
【发布时间】:2013-01-10 20:01:04
【问题描述】:

我有一个文本文件 FILE1.txt,其中记录了指定格式的数据。

[39645212,-79970785]35892002323232[0.0][39645212,-79970785]35892002323232[12.2]

我想将此数据加载到大小为 2*4 的矩阵中。我尝试使用 dlmread 这会引发错误。我正在尝试使用 textread 获得一些东西。我怎样才能得到类似的东西:

39645212 -79970785 35892002323232 0.0
39645212 -79970785 35892002323232 12.2

【问题讨论】:

    标签: matlab


    【解决方案1】:
    fid = fopen('fun.txt'); %the file you want to read
    A=fscanf(fid,'[%d,%d]%d[%g][%d,%d]%d[%g]',[2 inf]);
    fclose(fid);
    

    格式化字符串的语法见fscanf

    【讨论】:

    • 您好,感谢您的回复,但这不起作用。我试图看看有什么问题。它对你有用吗
    【解决方案2】:

    让我们尝试使用regexp

    mat = []; % I am lazy and I do not per-allocate. this is BAD.
    fh = fopen( 'FILE1.txt', 'r' ); % open for read
    line = fgetl( fh );
    while ischar( line )
        tks = regexp( line, '\[([^,]+),([^\]]+)\]([^\[]+)\[([^\]]+)', 'tokens' );
        for ii = 1:numel(tks)
            mat( end+1 ,: ) = str2double( tks{ii} );
        end
        line = fgetl( fh );
    end
    fclose( fh ); % do not forget to close the handle :-)
    

    注意事项:

    1. 我假设 '[', ']' 和 ',' 之间没有空格,只有数字。所以我可以在恢复的字符串上使用str2double

    2. 我没有预先分配mat - 这是不好的做法,会显着降低性能。有关如何预分配的详细信息,请参阅this question

    【讨论】:

    • 嘿,谢谢。它成功了。但第三个单元格值 35892002323232 为 3.5892e+014。有什么办法可以得到 35892002323232 格式
    • 您正在处理浮点格式的非常大的数字。您可能需要将它们转换为 int64 以保持精度。
    【解决方案3】:

    您的问题非常具体,我的解决方案也是如此:

    C = textread('FILE1.txt', '%s', 'delimiter', '\n');
    A = reshape(str2num(regexprep([C{:}], '[\]\[,]', ' ')), 4, [])'
    

    这会将所有括号和逗号替换为空格,将所有内容转换为数字并重新调整为具有 4 列的矩阵 A。它也应该适用于多行的输入文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2012-02-27
      相关资源
      最近更新 更多