我在元胞数组中有一堆 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 行作为示例是否会明显更快,但我希望当 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 ;
扩展这个想法,您可以将其设为函数
而不是脚本
,您可以在其中添加一些后处理并在变量中返回结果,而不是直接在工作区,但您必须首先看看基本想法是否会带来任何速度改进。
关于string - MATLAB:使用 'eval' 计算字符串的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53762613/