将数据从文件读入数组matlab

时间:2018-03-15 12:46:52

标签: matlab

我不确定哪个标题更适合我的情况所以我只是让它以最一般的方式编写。我有以下结构的文件:

Step 1
0.10190103    
0.10145140    
0.10097524    
0.10050153    
0.10003042    
9.95795131E-02
9.91610140E-02
Step 2
9.81189385E-02
9.75561813E-02
9.80424136E-02
0.10000000    
0.10000000    
9.80617628E-02
9.77829769E-02
...
Step N
0.10000000    
0.10000000    
9.93788019E-02
0.11977901    
0.12290157    
0.12588248    
0.12861508

我需要从N个数组中读取它,所以

V1 = [0.10190103    
0.10145140    
0.10097524    
0.10050153    
0.10003042    
9.95795131E-02
9.91610140E-02]

V2 = [9.81189385E-02
9.75561813E-02
9.80424136E-02
0.10000000    
0.10000000    
9.80617628E-02
9.77829769E-02]

VN = [0.10000000    
0.10000000    
9.93788019E-02
0.11977901    
0.12290157    
0.12588248    
0.12861508]

我已经阅读了一些将数据读入数组的示例,但是没有与我的案例相关的内容......

有人可以帮我吗??

我的尝试

d = readtable('whole res.txt'); % name of file 
d = table2cell(d);  
d = regexprep(d,' ','');
d = cellfun(@str2double,d,'uni',0);
d(cellfun(@isnan,d)) = [];
d = reshape(cell2mat(d),12,[]); % 12 - is values number

但仍然无效。 回溯:

Error using readtable (line 143)
Reading failed at line 2. All lines of a text file must have the same number of delimiters. Line 2 has 4
delimiters, while preceding lines have 1.

样本文件

Step 1
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000001    
0.10000001    
0.10000001    
0.10000000    
0.10000001    
0.10000001    
0.10000001    
Step 2
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10000000    
0.10034978    
0.10070127    
0.10070127    
0.10000000    
0.10000001    
0.10000001    
0.10000001 

PRINTSCREEN

enter image description here

1 个答案:

答案 0 :(得分:1)

假设数据具有STRICT格式,即: - 一条线是“步骤线”或数字
- “步骤线”必须是格式“步骤N”,其中N是整数
- 每步可以显示多少个数字

然后这是一个解决方案。随意学习并适应您的需求。

function Out = readData (In)
  C = strsplit (fileread (In));
  Out = cell(1,1); AtStepcount = false; CurrIndex = 0;

  for I = 1 : length (C)
    if strcmp (C{I}, 'Step'); AtStepcount = true; continue; end
    if AtStepcount
      CurrIndex = str2double(C{I}); Out{CurrIndex} = []; AtStepcount = false; 
      continue
    end
    Out{CurrIndex} = [Out{CurrIndex}; str2double(C{I})];
  end
end

用法:

V = readData ('myDataFile');

注意:这将返回单个单元格数组,步骤编号用作创建的每个单元格元素的索引。无论如何你应该这样做;将变量命名为“V1”,“V2”等通常是一个坏主意,因为你无法使用它进行迭代。使用上述解决方案,您的数组将存储为V{1}V{2}等,而V本身可用于for循环。