我有一个文件,我通过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}
答案 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'