【问题标题】:Speed up Matlab integral calculation using either symbolic or numeric methods?使用符号或数值方法加速 Matlab 积分计算?
【发布时间】:2014-09-07 17:20:04
【问题描述】:

两个月前我是 Matlab 初学者。我将它用于我的暑期项目来处理 MRI 图像。 最近,我为如下所示的集成编写了代码。但是,这两种方法都非常缓慢。运行它们花了一天时间。如何改进它们以缩短运行时间?

  1. 符号方法:

    syms t;
    T=t*ones(79,95,78);
    RF1=(1/2)*double(int(((T+x1).^(-1/2)).*((T+y1).^(-1/2)).*((T+z).^(-1/2)),t,0,inf));
    RD1=(3/2)*double(int(((T+x1).^(-1/2)).*((T+y1).^(-1/2)).*((T+z).^(-3/2)),t,0,inf));
    
  2. 数值法:

    fun1=@(T) ((T+x1).^(-1/2)).*((T+y1).^(-1/2)).*((T+z).^(-1/2));
    RF1=(1/2)*integral(fun1,0,inf,'ArrayValued',true);
    fun2=@(T) ((T+x1).^(-1/2)).*((T+y1).^(-1/2)).*((T+z).^(-3/2));
    RD1=(3/2)*integral(fun2,0,inf,'ArrayValued',true);
    

其中x1y1z 是 79×95×78 实矩阵。

【问题讨论】:

    标签: performance matlab symbolic-math integral


    【解决方案1】:

    您正在尝试计算 555,750 个积分,因此需要一些时间。以下是一些可能会有所帮助的建议。

    1. 首先,您可以稍微更有效地表达您的方程(这可能会影响结果的数值精度,具体取决于您的值的大小和问题的稳定性):

    fun1 = @(T)1./sqrt((T+x1).*(T+y1).*(T+z));
    fun2 = @(T)1./sqrt((T+x1).*(T+y1).*(T+z).*(T+z).*(T+z));
    

    可以对符号情况执行相同的转换。在仅对较小的(4,524 个元素数组)x1y1z 数组使用随机值的测试中,您的两组积分在我的机器上的计算速度都快了四倍。

    2. 您还可以通过将匿名函数转换为常规 M-File 函数来稍微提高速度。在单独的文件中:

    function RF1 = fun1(T,x1,y1,z)
    RF1 = 1./sqrt((T+x1).*(T+y1).*(T+z));
    

    function RD1 = fun2(T,x1,y1,z)
    RD1 = 1./sqrt((T+x1).*(T+y1).*(T+z).*(T+z).*(T+z));
    

    然后通过x1y1z作为参数调用它们:

    RF1 = 0.5*integral(@(T)fun1(T,x1,x2,z),0,Inf,'ArrayValued',true);
    RD1 = 1.5*integral(@(T)fun2(T,x1,x2,z),0,Inf,'ArrayValued',true);
    

    我在我的机器上看到了一个很小但不可忽略的差异:我尝试的数据快了大约 10%。这可能是因为 M 文件是单独 JIT 编译的,而且常规函数的处理方式可能与匿名函数略有不同。

    3. 当然,您还应该使用integral 的绝对和相对公差。您还可以查看矢量化的quadv 是否更快并提供准确的结果(但请注意,该函数将在未来版本的 Matlab 中删除)。根据您的数据和函数的性质,甚至可以离散化问题(使用较大的上限而不是Inf)并使用trapz 之类的方法来执行集成,尽管我不知道这样会不会更快。

    对于符号情况,您可以尝试将t 定义为真实的(即syms t real;)并可能将'IgnoreAnalyticConstraints' 选项指定为true,以查看其中任何一个是否可以提高速度。符号数学在内存方面也可能效率低下,因此您也可以尝试分解问题并以块的形式集成(例如逐行)。除了int,还有其他选项可能更快,但如果没有您的实际数据值,就很难说(如果您不需要精度,纯数字方法会快得多)。

    4. 最后,如果你不需要太多的精度,只关心速度,你可以在 C 中实现 "fast inverse square root trick" mex

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-13
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多