我正在尝试将数据文件(此处为代表三行的字符串)转换为如下结构数组:
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行数据。
谢谢
答案 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
的每个元素都是一个数组。使用cellfun
和num2cell
可以将它们转换为单元格数组:
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)