问题
Solve Ax = b
. Real double. A
is overdetermined Mx2 with M >> 2. b
is Mx1. I've run a ton of data against mldivide
, and the results are excellent. I wrote a mex routine with MKL LAPACKE_dgels
and it's nowhere near as good. The results have a ton of noise and the underlying signal is barely there. I checked the routine against the MKL example results first. I've searched through the mldivide
doc (flowchart) and the SO questions. All I found is Matlab uses QR factorization for overdetermined rectangular.
What should I try next? Am I using the wrong LAPACK routine? Please help guide me in the right direction.
Update: To within E-15 floating point difference on the solution vector, Intel MKL LAPACKE_dgels has the same result as Matlab mldivide for real double overdetermined (rectangular) problems. As far as I can tell, this is the QR method used.
Beware the residuals returned from this dgels. They do not equate to b - Ax. Many of them are close to this value, whereas some are far from it.
回答1:
The problem was not the solution x
, rather the returned residuals from DGELS
. This routine's outputs are modify-in-place on the input array pointers. The MKL doc says the input array b
is overwritten with the output vector x
for the first N
rows, then the residuals in N+1
to M
. I confirmed this with my code.
The mistake was in aligning the b[N+1]
residuals to original inputs b[1]
, and making further algorithmic decisions on that. The correct alignment of residual to original input is b[1]
to b[1]
. The first N
residuals are not available; you have to compute those afterwards.
The doc doesn't say they are residuals per se, rather specifically
the residual sum of squares for the solution in each column is given by the sum of squares of modulus of elements
n+1
tom
in that column.
来源:https://stackoverflow.com/questions/58171528/why-is-matlabs-mldivide-so-much-better-than-dgels