【问题标题】:Read block of data into matlab array将数据块读入matlab数组
【发布时间】:2013-01-04 22:28:41
【问题描述】:

我有一个如下所示的数据文件

3 1.0 1.4 1.7
2 1.2 1.5
1 1.1
2 1.1 1.2

对于每一行,第一个整数表示该行中浮点数的个数。

现在我想将所有数据加载到一个单独的matlab数组中,忽略第一列,也就是我想得到一个这样的数组

>>arr = [1.0, 1.4, 1.7, 1.2, 1.5, 1.1, 1.1, 1.2]

如果对于每一行,我们有相同数量的浮点数,我可以简单地这样做

>>arr = load datafile ;
>>arr = arr(:,2:end) ; %ignore the first column
>>arr = arr(:) ; 

但是,如果我们在每一行中有不同数量的浮点数,似乎我们不能直接将文件加载到矩阵中。有什么简单的方法可以做到这一点吗?

谢谢。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    首先,让我们将数字读取为字符串:

    C = textread('myfile.txt', '%s', 'delimiter', '\n');
    

    结果是字符串的单元格数组,所以让我们在每个单元格上应用str2num 以获得数值:

    C = cellfun(@str2num, C, 'Uniform', false);
    

    现在让我们丢弃每个单元格中的第一个元素:

    C = cellfun(@(x)x(2:end), C, 'Uniform', false);
    

    最后,我们将所有值连接到一个向量中:

    arr = [C{:}]
    

    这是完整的代码:

    C = textread('test.txt', '%s', 'delimiter', '\n'); %// Read data
    C = cellfun(@str2num, C, 'Uniform', false);        %// Convert to numbers
    C = cellfun(@(x)x(2:end), C, 'Uniform', false);    %// Remove first values
    arr = [C{:}]
    
    arr = 
        1.0000    1.4000    1.7000    1.2000    1.5000    1.1000    1.1000    1.2000
    

    【讨论】:

    • 谢谢 EitanT,这是解析文件的好方法。 textread 看起来有点像 Python 的 open(somefile).readlines() 或 open(somefile).read().split(some delimiter)
    【解决方案2】:

    一个简单的方法是逐行读取文件

    fid = fopen('data.txt');
    arr = [];
    tline = fgetl(fid);
    while (tline ~= -1)
        temp = str2num(tline);
        arr = [arr temp(2:end)];
        tline = fgetl(fid);
    end
    

    您也可以尝试使用loadcell 函数,虽然我没有尝试过,所以我不确定它是否适合您。

    【讨论】:

    • 谢谢你,ioums,虽然这个解决方案看起来有点 C 风格
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多