有效地求和 MATLAB 中的 N 个函数句柄

Summation of N function handles in MATLAB efficiently

我想高效地计算以下函数,因此最好使用函数句柄。

在给定的等式中,只有 "s" 是变量。其余的是一些已知的常量,但它们在循环内发生变化。我想获取它作为函数句柄,因为稍后我需要找到这个函数的根。

这个问题与有关。但答案似乎效率低下,我无法为整个事情获得一个函数句柄。有什么办法吗?

我的试用:

K=10;
N=4;

for ii=1:K
    for jj=1:N
f{ii,jj}=@(x) p_th0{ii}(jj).*log(p_th1{ii}(jj)/p_th0{ii}(jj)).*(p_th1{ii}(jj)/p_th0{ii}(jj)).^x;
    end
end

function y = sum_of_functions(f,x)
   y = 0;
   for ii=1:numel(f)
    y = y + f{ii}(x);
   end
end

r = FindRoots(@(x)sum_of_functions(f,x),A,B,2^5,0);

这段代码中的"x"(对应公式中的"s")是后面求根的变量。 "p_th0" 和 "p_th1" 是一些已知常量的单元格(在外部 while 循环内变化)。在上面的代码中,这部分 f{ii,jj}=@(x) 缺少我们需要将总和除以的项。所以它只考虑给定数字中分子的双和。

我还需要注意的是,我对整个事情没有一个单一的功能句柄感到不高兴。我所拥有的只是一个具有一些功能的单元格,每次我需要计算总和时,我都必须先构建总和。相反,我想构建一次函数句柄的总和,然后在 "FindRoots" 中使用这个函数句柄。

如果你忘记匿名函数,只写一个函数来计算你的值,效率会高得多。

f = @(x)theFunction(p_th0,p_th1,x);
r = FindRoots(f,A,B,2^5,0);

function y = theFunction(p_th0,p_th1,x);
   K = numel(p_th0);
   N = numel(p_th0{1});
   y = 0;
   for ii=1:K
      for jj=1:N
         B = p_th1{ii}(jj)/p_th0{ii}(jj);
         A = p_th0{ii}(jj).*log(B);
         y = y + A .* B.^x;
      end
   end
end

如果您创建 a nested function 和 return 一个句柄,那么您甚至可以预先计算其中的一些计算。这是一个相当奇特的解决方案,但它比上面的代码更有效。

f = getFunctionHandle(p_th0,p_th1);
r = FindRoots(f,A,B,2^5,0);

function out = getFunctionHandle(p_th0,p_th1);
   K = numel(p_th0);
   N = numel(p_th0{1});
   A = zeros(K,N);
   B = zeros(K,N);
   for ii=1:K
      for jj=1:N
         B(ii,jj) = p_th1{ii}(jj)/p_th0{ii}(jj);
         A(ii,jj) = p_th0{ii}(jj).*log(B(ii,jj));
      end
   end

   % nested function
   function y = func(x)
      y = 0;
      for ii=1:numel(A)
         y = y + A .* B.^x;
      end
   end

   out = func(x)
end