string - MATLAB:使用 'eval' 计算字符串的替代方法

标签 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 行作为示例是否会明显更快,但我希望当 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/

相关文章:

MySQL 前导 0 的日期格式

java - 如何控制 TextView 何时将 String 发送到新行?

string - 如何在scala中将长十六进制字符串转换为BigInt

java - 当数组未满时如何比较字符与数组

c - 将 int 添加到 char 数组

java - 从 Try-Catch 中获取字符串

MATLAB:根据一组分散的 3D 点计算凹多面体的体积

打印或导出时无法正确呈现 Matlab 字体

oop - 为什么我不能对重载 subsref 的类使用内置函数?

c++ - 反转字符串,奇怪的输出 C++