微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Octave 从带有常量的向量函数中获取 function_handle

如何解决Octave 从带有常量的向量函数中获取 function_handle

我试图得到一个

这样的向量函数
  syms x
   fn=function_handle([x^2;1])

输出为@(x) [x.^2;1]

这当然会导致在使用矢量参数调用 fn 时出错 (尺寸不匹配) 有没有办法避免这个问题?

我试过了fn=function_handle([x^2;1+0*x])

但是代码优化 - 或者其他 - 删除了 0*x - 项。

有什么建议吗?

解决方法

如果您仔细想想,function_handle 在这里所做的事情是合理的,因为您在这里需要的场景无法提前可靠地预测。所以我认为没有明显的选择来改变它的行为。

您可以通过多种方式解决此问题。

一种方法是将函数句柄视为未向量化,并依赖外部向量化,例如

f = function_handle([x^2; 1]);
[arrayfun( f,[1,2,3,4,5],'uniformoutput',false ){:}]

或者,您可以引入一个符号辅助常量 c,并适当地调用 f。您还可以创建一个使用适当默认常量的包装函数。示例:

f = function_handle([x^2; c],'vars',[x,c]);
f( [1,1,1] )

g = @(x) f( x,ones(size(x)) );
g([1,5])

f = function_handle([x^2; (x+c)/x],c]);
f([1,0)

g = @(x) f( x,0 )
g([1,5])
,

谢谢。 今天,我很高兴找到了一个解决方案。 我把arrayfcn变成了cellfcn:

    f_h_Cell=@(x,y) {x .* y,0}
    
   nf = @(x) @mifCell2Mat (f_h_Cell (x (size (x) (1) * 0 / 2 + 1:size (x) (1) * 1 / 2,{':'} (ones (1,ndims (x) - 1)){:}),x (size (x) (1) * 1 / 2 + 1:size (x) (1) * 2 / 2,ndims (x) - 1)) {:})))

然后:

function res=mifCell2Mat(resCell)
  resCell=transpose(resCell);
  [~,idx]=max(cellfun(@numel,resCell));
  refSize=(size(resCell{idx}));
  resCell=cellfun(@(x) x+zeros(refSize),resCell,false);
  res=cell2mat(resCell);
endfunction

所有自动调用以下函数 f=fcn(name,domain,parms,fcn);

所以一个简单的 f.nf([x;y;z]) 调用给出了结果。

当然它不起作用,如果有 numel 之间的 1 并说 size=[10,10] of 例如 size=[10,1],但那又怎样...在大多数情况下它对我有用(直到现在:总是)。

哦,当我在这里阅读我的代码时,我发现了一个小错误:

refSize=(size(resCell{idx}));

当然必须改成

refSize=(size(resCell{idx(1)})); 

因为 idx 中可能有多个最大尺寸,所以我选择了第一个。我首先对常量 outDims 进行测试,以便这些解决方法仅在存在常量时才发生。在其他情况下(如果所有 outDims 都包含域变量)一个简单的矩阵句柄匿名函数向用户显示:

f_h_Mat=@(x,y) [x .* y; x]

nf=@(x) f_h_Mat (x (size (x) (1) * 0 / 2 + 1:size (x) (1) * 1 / 2,ndims (x) - 1)) {:}),x (size
(x) (1) * 1 / 2 + 1:size (x) (1) * 2 / 2,ndims (x) - 1)) {:}))
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。