我在一个单元数组中有一堆char数组,它实际上代表了MATLAB结构的声明。类似这样的东西:
tmp{1} = 'testData.input = [1;2;3;4;5]'
tmp{2} = 'testData.output = [2;4;6;8;10]'
我需要执行这些"命令",并最终创建相应的结构。我在for循环中使用eval
函数,它很有效。
numEntries = numel(tmp);
for i = 1 : numEntries
eval(tmp{i});
end
然而,这是令人痛苦的缓慢。我应该提到的是,真正的char数组非常大,有效地包含了3000多个数字。此外,tmp
细胞阵列本身包含大约25000个细胞。如果我不能更改输入数据,即tmp
只是从外部来源提供的,那么有没有办法提高性能?
我无法仅以您给出的2行为例来测试它是否明显更快,但我希望当tmp
的元素数量增加时,这种方法会更快。
其想法是将包含在tmp
中的所有赋值指令写入一个文本文件(实际上是.m
文件(,然后简单地执行.m
文件。对于大量的行,我希望这比在循环中重复调用eval
要快得多。
因此,这对您的示例tmp
来说很好,您最终在工作空间中得到了结构testData
。
%% Create an '.m' file containing all the assignment instructions from the cell array
tmpFile = 'tmpFile2execute.m' ;
fidw = fopen( tmpFile , 'w' ) ;
fprintf(fidw,'%% Auto generated filen'); % or any other header line you want, or none...
for i = 1 : numel(tmp) ;
fprintf(fidw,'%s ;n',tmp{i});
end
fclose(fidw) ;
% (optional) only to keep workspace tidy
clear i fidw tmpFile tmp
%% Execute the file
tmpFile2execute ;
扩展这个想法,你可以把它做成function
,而不是script
,在那里你可以添加一些后处理,并在变量中返回结果,而不是直接在工作空间中,但你必须先看看基本想法是否能提高速度。
cellfun(@eval,tmp);
将在一定程度上提高循环的性能。否则,您可能需要编写自己的解析器(如果需要有限类型的输入,例如只有像结构.some_field.some_other_subfield=[some_array]这样的赋值,则可能会更快(。
请注意,使用eval
是一个有风险的函数(如果Mischief先生在输入数据中写入类似!rm -Rf /
、!del *.*
或rmdir(matlabroot,'s')
的内容,那么在评估这些字符串时可能会出现大混乱(