【问题标题】:Evaluate multivariable function with changing dimension of input评估输入维度变化的多变量函数
【发布时间】:2015-07-05 23:57:08
【问题描述】:

给定一个函数 f:R^m -> R^n,其中 m,n 一直在变化。将其实现到 Matlab 函数中的最佳方法是什么,该函数在任意点 x∈R^m 处评估输出。

函数是向量值的事实,即它的目标空间是多维的,使用匿名函数数组很容易处理。然后我们可以使用一个简单的循环:

function testFunc(f,x)
resultArray = zeros(numel(f),1);
for kk = 1: length(f)
    resultArray(kk) = f{kk}(x);
end
resultArray
end

在 m=1, n=3 的情况下,函数如下

f = {@(x) (x*x); @(y) (exp(y)); @(z) (cos(z))}

产生预期的输出

testFunc(f,2)

resultArray =

4.000000000000000
7.389056098930650
-0.416146836547142

如果 m 是固定的,那么这可以很容易地扩展到多变量的情况。但是我事先不知道m的值。

如何解决这个问题?提前致谢。


示例。假设我成功实现了我的函数 testFunc。那么命令提示符应该是这样的:

 >> f = @(x,y) (x*y);
 >> g = @(x,y,z) (exp(x*y*z));
 >> h = {@(x,y) (log(x*y)); @(x,y) (sin(x*y))}
 >> p = [1;2];
 >> q = [1;2;3];
 >> testFunc(f,p)
 ans = 
       2
 >>testFunc(g,q)
 ans =

       4.034287934927351e+02
 >> testFunc(h,p)
 ans =
       0.693147180559945 
       0.909297426825682

【问题讨论】:

  • 如果将 resultArray(kk) 替换为 resultArray{kk} 以生成元胞数组会怎样。那么 x 可以是一个向量
  • @freude 我看不出数组有什么帮助。以'函数' f = @(x,y) (xy) 和 g= @(x,y,z) (exp(xy*z)) 和点 p 为例=(1,2) 和 q=(1,2,3)。那么 testFunc(f,p) 应该输出 2 并且 testFunc(g,q) 应该输出 exp(6)。但我不能在两者之间更改 testFunc。
  • 我无法理解 m(输入向量的大小)不是 1 时的输出应该是什么样的。你能举一个 m = 2 的例子吗?
  • @MartinJ.H.我想你的意思是m = 2?在这种情况下,请看我上面的评论。
  • @MartinJ.H.最后,我还使用示例输出编辑了我的帖子。

标签: matlab math


【解决方案1】:

修改你自己的起点,这就是你正在寻找的解决方案。至少,如果我正确理解了您的问题。它为您的测试用例提供所需的输出。使用的原理是comma separated lists.的原理

function testFunc(f,x)

    x=num2cell(x);

    resultArray = zeros(numel(f),1);

    if ~iscell(f)
        f={f};
    end

    for kk = 1: length(f)
       resultArray(kk) = f{kk}(x{:});
    end

    resultArray

end

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多