【问题标题】:How to efficiently import data from files containing a mix of numbers and strings into a Matlab cell array?如何有效地将包含数字和字符串混合的文件中的数据导入 Matlab 单元阵列?
【发布时间】:2014-07-31 17:37:28
【问题描述】:

我有大约 30 个不同尺寸的文本文件,平均为 2050x1450。如图所示,前两行是char类型,分别表示profile的数量和录制的时间。其余行是 double 类型的值。

       #1        #2       #3...........#10      #1       #2       #3......
Time 21:22:10 21:23:56 21:24:07.... 06:19:11 06:21:00 06:21:23 06:23:11......
15    0.00     0.00      0.00   ....  0.00      0.00     0.00    0.00......
30   -6.09    1200.44   32.08   .... -0.17     9.87    -44.65   768.12......
.      .         .        .     .....           .         .         .........
.      .         .        .     .....           .         .         .........
.      .         .        .     .....           .         .         .........
2050  76.009   32.98   -5.91    ..... 79.15    15.54    -87.60  -10.74 ......

使用这种结构,我发现很难将这些文件的内容分配到 matlab 下的元胞数组中,因为命令“dlmread”仅适用于数字数据。我的问题如下: 如何将这些文件的内容有效地分配到元胞数组中?

我用 importdata 命令 matlab 对其进行了测试:

PathName = uigetdir;
d = dir(fullfile(PathName,'*.txt'));
    for i = 1:numel(d)
    A(i) = importdata(fullfile(PathName, d(i).name),'\t');
end

当我执行它时,我有三个流(数据、文本数据、colheaders)。我的第一行全部存储在一个盒子 A(1,1).textdata{1,1} 中。 A(1,1).textdata{1,2},...,A(1,1).textdata{1,1450} 完全为空,相反到我在第二行得到的结果。

【问题讨论】:

    标签: matlab parsing import


    【解决方案1】:

    试试

    A(i) = importdata(filename,' ',2)
    

    这将为您提供矩阵中的所有双精度数和元胞数组中的时间。

    第一行以一个字符串结束。您可以将其拆分为如下矩阵:

    headerStr = strsplit(A(i).textdata{1})
    

    strsplit 是 Matlab 2013 中的一个新函数。在旧版本的 Matlab 中,这应该可以工作:

    headerStr = textscan(A(i).textdata{1},'%s')
    

    然后您可以使用num2cell 将这些矩阵转换为元胞数组

    headerCells = num2cell(headerStr{1})
    

    这将返回一个单元格数组,每个单元格一个字符串

    现在你在headerCells 中有你的第一行'#1'等,A(i).textdata{2} 中有你的第二行时间,A(i).data 中有你所有的数字

    您可以将其组合成一个大单元数组:

    alldata = [[cell(1) headerCells']; A(i).textdata(2,:); num2cell(A(i).data)]
    

    【讨论】:

    • 我们如何才能将前两行放在一个元胞数组中?我对第一行的问题
    • @user3137771,使用 strsplit 和 num2cell。我为你更新了答案。
    • 这给了我一个错误信息:??? 'char' 类型的输入参数的未定义函数或方法 'strsplit'。但是为什么在 A(1,1).textdata{1,2},...,A(1,1).textdata{1,1450} 中是完全空的?
    • strsplit 似乎是 Matlab 2013 中的一个新功能。在旧版本中,您可以使用 textscan
    • 当我使用: textscan(A(1).textdata{1},'%s'), ans = {1449x1 cell} 但我通常发现 ans = {1x1 cell} (或#1 )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多