matlab优化了阶乘

时间:2016-11-02 17:24:30

标签: matlab optimization factorial

我正在优化我的代码,一遍又一遍地计算很多相同的阶乘。调用来自几个不同的函数,所以我想避免给数组预先计算的因子作为每个函数的参数,尽管我认为这是最快的方法。

使用全局变量效果更好,但它仍然没有我想象的那么快,因为全局变量的加载现在几乎与阶乘的计算一样长。

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

在这两种情况下都有“持久性因素”这一行。 “全球传统设备”现在大部分时间都在分析器中。

还有其他办法吗?我可以定义类似于全局可用的变量而不加载它吗?

1 个答案:

答案 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