有效地求和 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
我想高效地计算以下函数,因此最好使用函数句柄。
在给定的等式中,只有 "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