首页 > 解决方案 > Matlab:如何将文件加载为结构数组

问题描述

我正在尝试将数据文件(这里用三行表示文件的字符串)转换为这样的结构数组:

cel = textscan('1 1.1 2 2.2 3 3.3', '%u %f');
str = cell2struct(cel, {'f1', 'f2'}, 2);

但是,现在我有一个维度为 1x1 的结构数组,其中我只能使用数组的字段访问列,但不能访问整行(如第二行的“str(2)”)。

我需要的是有一个结构数组(或如何调用它),如下所示:

str = struct('f1', {1, 2, 3}, 'f2', {1.1, 2.2, 3.3});

因为现在我可以(例如)像这样过滤它:

subStr = str(find([str.f1] > 1))

在第一种情况下我做不到。知道如何到达那里吗?最后,我能够通过以下方式做到这一点:

cel = textscan('1 1.1 2 2.2 3 3.3', '%u %f');
[f1, f2] = cel{:};
str = struct('f1', num2cell(f1'), 'f2', num2cell(f2'));

但感觉不对,恐怕会很贵(文件很大)。

编辑:

我的解决方案确实对内存要求太高,因此无法使用。典型的文件有页眉、页脚和 c。6 列 5e6 行数据。

谢谢

标签: matlab

解决方案


如果您实际使用的是包含行的文件,则会更容易。例如,如果data.txt包含:

1 1.1
2 2.2
3 3.3

现在您可以使用以下方法简单地加载它:

tbl = readtable('data.txt');
tbl.Properties.VariableNames = {'f1', 'f2'};

这导致更好的(恕我直言)过滤语法:

subTbl = tbl(tbl.f1 > 1, :);

我建议您阅读一些有关MATLAB 中的表的信息,以了解它们的(许多)功能。


最后,如果你坚持使用struct数组,你可以这样做:

str = table2struct(tbl); 3×1 struct array with fields: f1 f2

推荐阅读