-3

难道不能做这样的评价吗?

我使用 eval 创建一个函数(类验证创建了一个函数句柄)然后我使用 eval 来使用这个函数句柄。但它不评估,导致函数本身。尝试了许多不同的方式来写行。如下。可能有一个简单的方法来做到这一点?

我为什么要这样做:我有很大的符号矩阵可以替代。为了更快地评估,我试图从每个元素中创建函数。对此有何建议?

(使用 Matlab v.7)

% 代码 - - - - - - - - - - - - - - - -

function [out]=sym2fnc_subs2(M,vars,val)

for a=1:size(M,1) for b=1:size(M,2)
  eval(['fnc=@(',sym2cell(vars,'comma'),') ''',sym2cell(M(a,b)),''';']);
  class(fnc)
  eval(['feval(@(varargin)fnc(varargin{:}),',sym2cell(sym(val),'comma'),')'])
  eval(['feval(fnc,',sym2cell(sym(val),'comma'),')'])
  eval(['out(',int2str(a),',',int2str(a),')=feval(fnc,',sym2cell(sym(val),'comma'),')'])
  out(a,b)=eval(['fnc(',sym2cell(sym(val),'comma'),')'])
end; end;

function [C]=sym2cell(M,varargin)
n = ndims(M);
for a=1:size(M,1); for b=1:size(M,2);
  if nargin==2
    if strcmp(varargin{1},'space'); s=' '; end;
    if strcmp(varargin{1},'comma'); s=','; end;
    if b==size(M,2); C(a,b) = {[char(M(a,b))]};
    else; C(a,b) = {[char(M(a,b)),s]}; end;
  else; C(a,b) = {char(M(a,b))}; end;
end; end;
if isvector(C); C=cell2mat(C); end;

% 结果 - - - - - - - - - - - - - - - -

>> syms x y
>> [out]=sym2fnc_subs(sym('y+x'),[y x],[0 0])
ans =
function_handle
ans =
y+x
ans =
y+x
??? Error using ==> eval (at the last eval which returns a 'char')
4

1 回答 1

1

我在这条线上遇到错误

  eval(['out(',int2str(a),',',int2str(a),')=feval(fnc,',sym2cell(sym(val),'comma'),')'])

eval 的参数解析为

out(1,1)=feval(fnc,0,0)

对 feval 的调用返回一个 1×5 字符数组 ( 'x + y'),它不适合out(1,1),它只能容纳一个字符。您可能想改用单元格索引,如下所示:

>> out{1,1} = feval(fnc, 0, 0)

out = 

    'x + y'
于 2015-03-04T22:18:28.303 回答