如何解决Octave 从带有常量的向量函数中获取 function_handle
我试图得到一个像
这样的向量函数 syms x
fn=function_handle([x^2;1])
输出为@(x) [x.^2;1]
这当然会导致在使用矢量参数调用 fn 时出错 (尺寸不匹配) 有没有办法避免这个问题?
我试过了fn=function_handle([x^2;1+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 举报,一经查实,本站将立刻删除。