通过udp评估代码或传输的例行程序

时间:2010-05-27 18:43:43

标签: matlab

我有一组代码,根据程序的启动方式,将在本地执行或发送到远程机器执行。我认为这种方法可行的理想方式如下:

line_of_code = 'do_something_or_other();';

if execute_remotely
    send_via_udp(line_of_code);
else
    eval(line_of_code);
end

问题是,我知道eval()函数效率低得离谱。另一方面,如果我在line_of_code块的每个部分写出if,则会打开错误的大门。除了简单地使用eval()吗?

还有其他任何方法可以更有效地完成此操作

1 个答案:

答案 0 :(得分:3)

编辑:在评论中进行了更多的考虑和讨论之后,我怀疑函数句柄是否可以通过UDP传输。我正在更新我的答案,而是建议使用函数FUNC2STR将函数句柄转换为字符串进行传输,然后使用函数STR2FUNC将函数句柄再次转换回函数句柄。传输...

要使用EVAL,您可以使用function handle而不是存储要在字符串中执行的代码行:

fcnToEvaluate = @do_something_or_other;  %# Get a handle to the function

if execute_remotely
  fcnString = func2str(fcnToEvaluate);   %# Construct a function name string
                                         %#   from the function handle
  send_via_udp(fcnString);               %# Pass the function name string
else
  fcnToEvaluate();                       %# Evaluate the function
end

以上假设函数do_something_or_other已存在。然后,您可以在远程系统上执行以下操作:

fcnString = receive_via_udp();        %# Get the function name string
fcnToEvaluate = str2func(fcnString);  %# Construct a function handle from
                                      %#   the function name string
fcnToEvaluate();                      %# Evaluate the function

只要本地和远程系统上存在函数do_something_or_other的代码(即m文件),我认为这应该有效。请注意,您还可以使用FEVAL来评估函数名称字符串,而不是首先将其转换为函数句柄。

如果您需要动态创建功能,可以在代码中将fcnToEvaluate初始化为anonymous function

fcnToEvaluate = @() disp('Hello World!');  %# Create an anonymous function

发送,接收和评估此代码的代码应与上述相同。

如果您也有传递给函数的参数,则可以将函数句柄和输入参数放入cell array。例如:

fcnToEvaluate = @(x,y) x+y;  %# An anonymous function to add 2 values
inArg1 = 2;                  %# First input argument
inArg2 = 5;                  %# Second input argument
cellArray = {fcnToEvaluate inArg1 inArg2};  %# Create a cell array

if execute_remotely
  cellArray{1} = func2str(cellArray{1});  %# Construct a function name string
                                          %#   from the function handle
  send_via_udp(cellArray);                %# Pass the cell array
else
  cellArray{1}(cellArray{2:end});  %# Evaluate the function with the inputs
end

在这种情况下,send_via_udp 的代码可能必须打破单元格阵列并分别发送每个单元格。收到后,函数名称字符串将再次使用STR2FUNC转换回函数句柄。