MATLAB:使用'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数组非常大,有效地包含了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')的内容,那么在评估这些字符串时可能会出现大混乱(

相关内容

  • 没有找到相关文章

最新更新