我正在尝试在matlab中使用预处理共轭梯度来加快速度。我正在使用这种迭代方法,因为反斜杠操作符太耗时。但是,我遇到了一些问题。对于例如我想解决这个由
给出的线性方程组Ax=B
其中A是稀疏正定矩阵,B也是矩阵。在matlab中我只能通过
来做到这一点x= A\B
但是,如果我使用pcg函数,那么我将不得不遍历B的所有列并解决个别问题
x(:,i)=pcg(A,B(:,i))
此循环将比x = A \ B花费更多时间。如果我只考虑单个列作为b而不是矩阵B,那么pcg比反斜杠运算符更快。但是,如果我考虑整个矩阵B,那么pcg比反斜杠运算符慢。所以没有必要使用pcg。
有什么建议吗?
使用Mattj建议的方法时,会显示以下错误
Error using iterapp (line 60)
user supplied function ==>
@(x)reshape(repmat(A*x,1,nb),[],1)
failed with the following error:
Inner matrix dimensions must agree.
Error in pcg (line 161)
r = b -
iterapp('mtimes',afun,atype,afcnstr,x,varargin{:});
答案 0 :(得分:0)
我认为我们需要查看关于时序测试和A和B的尺寸/稀疏度的更多数据,并更好地理解为什么pcg比mldivide更快。但是,你可以用这种方式实现你的目标,
[ma,na]=size(A);
[mb,nb]=size(B);
afun=@(x) reshape(A*reshape(x,na,[]),[],1);
X=pcg(afun,B(:));
X=reshape(X,na,nb);
答案 1 :(得分:0)
但是,如果我考虑整个矩阵B,那么pcg比慢 反斜杠运算符。所以没有必要使用pcg。
这确实有一定的意义。当反斜杠求解第一组方程A * x = B(:,1)时,它可以将其分析的部分回收到后面的列B(:,i),例如,如果它执行A的LU分解。
相反,PCG适用于不同B(:,i)的所有工作都是独立的。因此,使用PCG很可能没有意义。一个例外是每个B(:,i + 1)与B(:,i)类似。换句话说,如果B列以逐渐连续的方式变化。如果是这样,那么你应该像你一直在循环中运行PCG,但是使用第i个解决方案x(:,i)在循环的下一次迭代中初始化PCG。这将减少PCG必须执行的总工作量。