使用pcg的问题

时间:2014-01-26 16:56:39

标签: matlab optimization

我正在尝试在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{:});

2 个答案:

答案 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必须执行的总工作量。