这个问题可能太宽泛了,不能在这里发布,但我会尽量具体。如果您仍然认为它太宽泛,我将简单地将其删除。

  • 查看底部的 EDIT,了解我对该主题的最终想法。
  • 如果您可以访问并行计算工具箱并拥有 NVIDIA GPU,请查看 Ander Biguri 的回答。

  • 我的问题 :

    我正在使用 Newmark 方案(二阶隐式)求解动态方程,这涉及为 A*x=b 求解许多 x 形式的线性系统。

    我已经优化了所有不涉及求解线性系统的代码。就目前而言,线性系统求解在此过程中占用了多达 70% 的计算时间。

    我虽然使用 MATLAB 的 linsolve ,但我的矩阵 A 没有任何可用作 optslinsolve 输入的属性。

    想法:

    linsolve 的文档所示:



    据我所知,通过使用 mldivide ,MATLAB 将使用 LU 分解,因为我的矩阵 A 除了方形之外没有任何特定属性。

    我的问题 :

    所以我想知道我是否会通过首先使用 MATLAB 的 A 分解 lu 来获得一些时间,然后将它们提供给 linsolve 以便用 x = U\(L\b) 分别是上三角和下三角来求解 opts
    这样我会阻止 MATLAB 执行在 mldivide 过程中发生的所有属性检查。

    注意: 我绝对不期望获得巨大的时间 yield 。但在长达一周的计算中,即使是 2% 也很重要。

    现在你可能会问我为什么不自己尝试这个?好吧,我的计算大约运行到星期二,我想问一下是否有人已经尝试过这个并获得了时间,摆脱了由于 mldivide 进行矩阵属性检查而产生的开销。

    玩具示例:
    A=randn(2500);
    % Getting A to be non singular
    A=A.'*A;
    x_=randn(2500,1);
    b=A*x_;
    clear x_
    
    % Case 1 : mldivide
    tic
    for ii=1:100
    
        x=A\b;
    
    end
    out=toc;
    disp(['Case 1 time per iteration :' num2str((out)/100)]);
    
    % Case 2 : LU+linsolve
    
    opts1.LT=true;
    opts2.UT=true;
    
    tic;
    for ii=1:100
    
        [L,U]=lu(A);
    
        % It seems that these could be directly replaced by U\(L\b) as mldivide check for triangularity first
        Tmp=linsolve(L,b,opts1);
        x=linsolve(U,Tmp,opts2);
    
    end
    out2=toc;
    
    disp(['Case 2 time per iteration :' num2str((out2)/100)]);
    

    编辑

    所以我只是有机会尝试一些事情。

    我之前在 linsolve 的文档中错过了,如果您不指定任何 opts 输入,它将默认使用 LU 求解器,这正是我想要的。用它做一些时间测试(并考虑到@rayryeng 对“timeit that bad boy”的评论),与 mldivide 相比,它节省了大约 2~3% 的处理时间,如下所示。就时间增益而言,这不是什么大问题,但在长达一周的计算中,这是不可忽视的。
    timeit1626*1626 线性系统上的结果:
    mldivide :
     t1 =
    
       0.102149773097083
    
    linsolve :
    t2 =
    
       0.099272037768204
    

    亲戚: 0.028171725121151

    最佳答案

    我知道您没有 NVIDIA GPU 和并行计算工具箱,但如果您有,这将起作用:

    如果您将代码中的第二个测试替换为:

    tic;
    
    for ii=1:10
            A2=gpuArray(A); % so we account for memory management
            b2=gpuArray(b);
          x=A2\b2;
    end
    out2=toc;
    

    我的电脑说(CPU vs GPU)
    Case 1 time per iteration :0.011881
    Case 2 time per iteration :0.0052003
    

    关于matlab - mldivide 与(LU 和 linsolve),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40928442/

    10-12 13:46