Matlab:如何将文件加载为结构数组

时间:2019-01-23 13:48:02

标签: 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。六列中的5e6行数据。

谢谢

3 个答案:

答案 0 :(得分:1)

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

1 1.1
2 2.2
3 3.3

现在您可以使用以下命令简单地加载它:

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

这会产生更好的(imho)过滤语法:

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

我建议您阅读有关tables in MATLAB的内容,以了解其(许多)功能。


最后,如果您坚持使用struct数组,则可以执行以下操作:

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

答案 1 :(得分:0)

cel的每个元素都是一个数组。使用cellfunnum2cell可以将它们转换为单元格数组:

names = {'f1', 'f2'};
cel = textscan('1 1.1 2 2.2 3 3.3', '%u %f');
cel2 = cellfun(@num2cell, cel, 'UniformOutput', 0);

prep = [names;cel2];
str = struct(prep{:}).';

答案 2 :(得分:0)

我希望我能早些仔细阅读这些内容,但是根据thisthis的建议,不鼓励以我尝试的方式保存大型数据集,因为

  

具有许多字段和少量内容的结构具有较大的开销,应避免使用。具有数字标量字段的大型结构数组比具有包含大型数字数组的字段的结构需要更多的内存。

  

对于结构和单元格数组,MATLAB不仅会为每个数组创建标头,还会为结构的每个字段以及单元格数组的每个单元格创建标头。因此,存储结构或单元数组所需的内存量不仅取决于其保存的数据量,还取决于其构造方式。

因此,数组str.f(1:N)(对于较大的N)比str(1:N).f需要更多的内存。