我在一个单元格数组中有一堆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数组非常大,有效地包含了3,000多个数字。同样,tmp
单元数组本身包含大约25,000个单元。
鉴于我无法更改输入数据,也就是说,tmp
仅仅是从外部来源给出的,是否有一种方法可以提高性能?
答案 0 :(得分:4)
仅以您给出的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 file\n'); % 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
,在这里您可以添加一些后期处理并将结果返回到变量中,而不是直接在工作空间中,但是您必须看看基本思想是否首先提高了速度。
答案 1 :(得分:0)
cellfun(@eval,tmp);
将在某种程度上改善循环性能。否则,您可能必须编写自己的解析器(如果预期输入类型有限,则可能会更快,例如,仅使用 structure 。 some_field 。 some_other_subfield = [ some_array ];)。
请注意,eval
是一个有风险的函数(如果Mischief先生在输入数据中写入!rm -Rf /
,!del *.*
或rmdir(matlabroot,'s')
之类的内容,您可能会结束-弄乱了那些字符串的计算结果)