我正在优化我的代码,一遍又一遍地计算很多相同的阶乘。调用来自几个不同的函数,所以我想避免给数组预先计算的因子作为每个函数的参数,尽管我认为这是最快的方法。
使用全局变量效果更好,但它仍然没有我想象的那么快,因为全局变量的加载现在几乎与阶乘的计算一样长。
function [ facn ] = cfactorial( n )
global facs
if n > 170
facn = Inf;
elseif n == 0
facn = 1;
else
facn = facs(n);
end
我也尝试过将其设置为持久性,这也不会快得多。
function [ facn ] = cfactorial( n )
persistent facs
if isempty(facs)
load('facs.mat')
facs = faccs;
end
if n > 170
facn = Inf;
elseif n == 0
facn = 1;
else
facn = facs(n);
end
在这两种情况下都有“持久性因素”这一行。 “全球传统设备”现在大部分时间都在分析器中。
还有其他办法吗?我可以定义类似于全局可用的变量而不加载它吗?
答案 0 :(得分:3)
尽量避免调用函数并使用if..else
。矢量化是更好的方法。
你可以像这样制作阶乘矩阵:
factorials = [1 cumprod(1:170) Inf];
假设您希望调用factorial 5次,值n
s
ns = [3 0 56 23 456];
所以你可以得到如下的因子:
f_ns = factorials(min(ns, 171) + 1) ;
然后继续使用值f_ns
进行计算。
如果你不能预先计算f_ns
,你可以在需要多次计算阶乘的函数内部创建一个内联函数facn
并多次调用facn
:
function myfunction
factorials = [1 cumprod(1:170) Inf];
facn =@(n) factorials(min(n, 171) + 1) ;
facn(3);
facn(0);
facn(456);
end