将数据解析为结构数组

时间:2014-02-28 11:17:43

标签: matlab parsing

我有一个文件,我通过textscan函数读取,它存储在表格的1x6单元格数组中

[354018x1 uint64]    {354018x1 cell}    [354018x1 uint64]    [354018x1 uint64]    {354018x1 cell}    {354018x1 cell}

现在我想要一个带有approprotate字段名称的结构数组,我跟着http://abandonmatlab.wordpress.com/2009/08/12/programatically-creating-a-struct/并提出了

>> snames = {'a', 'b', 'c', 'd', 'e', 'f'};
>> arglist = {snames{:}; obj.components{:}};
>> s = struct(arglist{:});

不幸的是,在每一行中都存储了完整的数组[354018x1 uint64],例如

s(1)

ans = 

a: [354018x1 uint64]
b: 'test'
c: [354018x1 uint64]
d: [354018x1 uint64]
e: 'test4'
f: 'ob'

如何在不使用循环的情况下获取每个相应行中的每个元素?

如果我使用cell2struct

,这就是我得到的
>> f = {'a','b','c','d','e','f'}; s = cell2struct(C,f,2);
>> s(1)

ans = 

a: [354018x1 uint64]
b: {354018x1 cell}
c: [354018x1 uint64]
d: [354018x1 uint64]
e: {354018x1 cell}
f: {354018x1 cell}

1 个答案:

答案 0 :(得分:0)

这使用循环,但只使用每行,而不是每列,这是我认为你试图避免的。它利用动态字段引用来创建结构(http://blogs.mathworks.com/loren/2005/12/13/use-dynamic-field-references/),我假设你知道哪些行包含什么类型的值,否则它会变得有点复杂。

基本上,您构建一个字符串的单元格数组,然后循环这些行,将它们分配到正确的结构/结构字段,并根据需要进行数据类型转换。您可以在没有使用cellfun的循环的情况下执行此操作,但在那里处理数据类型转换测试会很麻烦(我认为)。无论如何,你不是在300k +列上循环而是只循环6行,所以性能不会有太大提升。

% matlab_test_2.txt:
% 1 3 5 7 9 10
% test
% 1 9 10 23
% 23 11 94 4
% testy
% testless

clear all;
fclose('all');
file = '<path>/matlab_test_2.txt';
f = fopen(file);
c = textscan(f, '%s', 'delimiter', '\n');
rows_with_numbers = [1 3 4];
rows_with_strings = [2 5 6];
snames = {'a', 'b', 'c', 'd', 'e', 'f'};
for i = 1:length(rows_with_numbers)
    index = rows_with_numbers(i);
    s.(snames{index}) = str2num(c{1}{index});
end
for i = 1:length(rows_with_strings)
    index = rows_with_strings(i);
    s.(snames{index}) = c{1}{index};
end
s

>> cell_test
s = 
    a: [1 3 5 7 9 10]
    c: [1 9 10 23]
    d: [23 11 94 4]
    b: 'test'
    e: 'testy'
    f: 'testless'