【问题标题】:Summation of N function handles in MATLAB efficiently在 MATLAB 中有效地求和 N 个函数句柄
【发布时间】:2020-01-30 01:49:07
【问题描述】:

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

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

此问题与this one which I asked recently 有关。但是答案似乎效率低下,我无法为整个事情获取单个函数句柄。有什么办法吗?

我的审判:

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”中使用这个函数句柄。

【问题讨论】:

  • 我只想写一个计算这个的函数。我完全不明白你现在是怎么回答上一个问题的。我想你想多了。
  • 为什么需要函数句柄?你能给出示例输入和输出吗?
  • @beaker 是的,请稍等。
  • @CrisLuengo 我不这么认为,但如果我遗漏了什么,你可能是对的。我同意只有一个功能,但如何?我无法总结上一个问题中的函数句柄。例如让 K=10 和 mk=4。如果 p0 和 p1 已知,那么我们应该能够对函数句柄求和以获得最终的函数句柄。让我提供更多关于我的试验的材料。

标签: matlab function loops for-loop anonymous-function


【解决方案1】:

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

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,并返回一个句柄,那么您甚至可以预先计算其中的一些计算。这是一个相当花哨的解决方案,但它比上面的代码更有效。

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

【讨论】:

  • 图中分母有“sum p1^s*p0^(1-s)”项,答案中缺失。
  • @SeyhmusGüngören:您的代码中也缺少这一点。我只是重写了你的代码。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多