MATLAB:替代使用'eval'来评估字符串

时间:2018-12-13 13:09:01

标签: string matlab char eval

我在一个单元格数组中有一堆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仅仅是从外部来源给出的,是否有一种方法可以提高性能?

2 个答案:

答案 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')之类的内容,您可能会结束-弄乱了那些字符串的计算结果)