【问题标题】:Reading file line by line in matlab在matlab中逐行读取文件
【发布时间】:2014-07-06 18:03:48
【问题描述】:

我有一个 MATLAB 代码的输入文件,其中列出了网格中相邻顶点的索引。对于与文件的行号具有相同等级的顶点,我列出了同一行上的相邻顶点索引。
例如

45, 56, 22
44, 12
12, 23,56,76

我想读这个 将文件作为单元格数组放入我的代码中。如下。

NBR = { {45,56,22}, {44,12}, {12,23,56,76} }

是否有任何 MATLAB 函数来完成此操作?

【问题讨论】:

标签: matlab


【解决方案1】:

新答案:

我终于找到了一个不错的解决方案。实际上,importdata 在这里会有所帮助,谢谢@Divakar。

>> C = importdata('file','')
C = 
    '45, 56, 22'
    '44, 12'
    '12, 23,56,76'
>> C = cellfun(@str2num, C, 'UniformOutput', 0)
C = 
    [1x3 double]
    [1x2 double]
    [1x4 double]
>> C = cellfun(@(x) mat2cell(x, [1], ones(size(x,2),1)), C, 'UniformOutput', 0)'
C = 
    {1x3 cell}    {1x2 cell}    {1x4 cell}
>> NBR = { {45,56,22}, {44,12}, {12,23,56,76} };
>> isequal(NBR,C)
ans =
     1

旧答案:

不幸的是,importdata 似乎对于这项任务来说太有限了,我没有找到用textscan 读取整个文件然后应用一些cellfuns 的好方法。 csvread 存在在应该有 NaN 值的地方插入 0 的问题,因此这对于实际包含零的数据集不起作用。

所以老式的方式看起来像这样:

fid = fopen('file');
ind = 1;
line = fgetl(fid); % #get first line

while line ~= -1; % #read until end of file
    cont = cellfun(@str2num, strsplit(line, ','));
    cont = mat2cell(cont, [1], ones(size(cont,2),1));
    C{ind} = cont;
    line = fgetl(fid);
    ind = ind + 1;
end

fclose(fid);

Demo,我的脚本保存为readin.m:

>> readin
>> C
C = 
    {1x3 cell}    {1x2 cell}    {1x4 cell}
>> C{1}
ans = 
    [45]    [56]    [22]
>> C{2}
ans = 
    [44]    [12]
>> C{3}
ans = 
    [12]    [23]    [56]    [76]
>> NBR = {{45,56,22}, {44,12}, {12,23,56,76}};
>> isequal(NBR,C)
ans =
     1

【讨论】:

    【解决方案2】:

    你可以在matlab中使用fgets逐行读取文件

    fid = fopen('yourfile');
    
    tline = fgets(fid);
    while ischar(tline)
        disp(tline)
        tline = fgets(fid);
    end
    
    fclose(fid);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2010-12-24
      • 2016-02-04
      相关资源
      最近更新 更多