1

I'm trying to convert the QR Decomposition from "Numerical Recipes in C" to work with skinny (tall) matrices. Does anyone know how to do this? I believe the problem lies in how the householder is multiplied with the A but I am unable to figure it out.

void qrdcmp(float **a, int n, float *c, float *d, int *sing)
{
    int i,j,k;
    float scale,sigma,sum,tau;
        *sing=0;

    for (k = 1; k < n; k++) {
        scale = 0.0;
        for (i = k; i <= n; i++) scale = FMAX(scale, fabs(a[i][k]));
        if (scale == 0.0) { // Singular case.
            *sing = 1;
            c[k] = d[k] = 0.0;
        } else { // Form Qk and Qk · A.
            for (i = k; i <= n; i++) a[i][k] /= scale;
            for (sum = 0.0, i = k; i <= n; i++) sum += SQR(a[i][k]);
            sigma = SIGN(sqrt(sum), a[k][k]);
            a[k][k] += sigma;
            c[k] = sigma * a[k][k];
            d[k] = -scale * sigma;
            for (j = k + 1; j <= n; j++) {
                for (sum = 0.0, i = k; i <= n; i++) sum += a[i][k] * a[i][j];
                tau = sum / c[k];
                for (i = k; i <= n; i++) a[i][j] -= tau * a[i][k];
            }
        }
    }

    d[n] = a[n][n];
    if (d[n] == 0.0) *sing=1;
}
4

0 に答える 0