qyz

来源:互联网 发布:java 图片合成pdf 编辑:程序博客网 时间:2024/05/22 15:43
#include < stdio.h > #include < math.h > #define N1 2#define M1 3#define F(1e-6)#if M1 < N1#define T M#define M N1#define N M1#else#define M M1#define N N1#endif#define STR {    if (fabs(a[j]) <= F * 10) a[j] = 0.0;    printf("%-10.5g", a[j]);}float A[m][N],U[m][m],V[N][N];int p,q;double arraym(float * x, int k) {    int i;    double r = 0.0;    for (i = 0; i < k; i++) r += x * x;    r = sqrt(r);    return r;}void mmmn2(float a[m][m], float b[m][N]) {    int i,    j,    k;    float t[m][N];    for (i = 0; i < M; i++) for (j = 0; j < N; j++) {        t[j] = 0.0;        for (k = 0; k < M; k++) t[j] += a[k] * b[k][j];    }    for (i = 0; i < M; i++) for (j = 0; j < N; j++) b[j] = t[j];}void mmmm1(float a[m][m], float b[m][m]) {    int i,    j,    k;    float t[m][m];    for (i = 0; i < M; i++) for (j = 0; j < M; j++) {        t[j] = 0.0;        for (k = 0; k < M; k++) t[j] += a[k] * b[k][j];    }    for (i = 0; i < M; i++) for (j = 0; j < M; j++) a[j] = t[j];}void mnnn1(float a[m][N], float b[N][N]) {    int i,    j,    k;    float t[m][N];    for (i = 0; i < M; i++) for (j = 0; j < N; j++) {        t[j] = 0.0;        for (k = 0; k < N; k++) t[j] += a[k] * b[k][j];    }    for (i = 0; i < M; i++) for (j = 0; j < N; j++) a[j] = t[j];}void nnnn1(float a[N][N], float b[N][N]) {    int i,    j,    k;    float t[N][N];    for (i = 0; i < N; i++) for (j = 0; j < N; j++) {        t[j] = 0.0;        for (k = 0; k < N; k++) t[j] += a[k] * b[k][j];    }    for (i = 0; i < N; i++) for (j = 0; j < N; j++) a[j] = t[j];}void Imm(float a[m][m]) {    int i,    j;    for (i = 0; i < M; i++) for (j = 0; j < M; j++) {        if (i == j) a[j] = 1.0;        else a[j] = 0.0;    }}void Inn(float a[N][N]) {    int i,    j;    for (i = 0; i < N; i++) for (j = 0; j < N; j++) {        if (i == j) a[j] = 1.0;        else a[j] = 0.0;    }}float fanshu(void) {    int i,    j;    float r = 0.0;    for (i = p; i <= q; i++) for (j = p; j <= q; j++) r += A[j] * A[j];    r = sqrt(r);    return r;}float miu(void) {    float x[4],    g1,    g2,    det,    q2;    if (q - p == 1) q2 = 0;    else q2 = A[q - 2][q - 1];    x[0] = A[q - 1][q - 1] * A[q - 1][q - 1] + q2 * q2;    x[3] = A[q][q] * A[q][q] + A[q - 1][q] * A[q - 1][q];    x[1] = A[q - 1][q - 1] * A[q - 1][q];    x[2] = x[1];    det = (x[0] - x[3]) * (x[0] - x[3]) + 4 * x[1] * x[1];    det = sqrt(det);    g1 = (x[0] + x[3] + det) / 2;    g2 = (x[0] + x[3] - det) / 2;    if (fabs(x[3] - g1) > fabs(x[3] - g2)) g1 = g2;    return g1;}void printmm(float a[m][m]) {    int i,    j;    for (i = 0; i < M; i++) {        for (j = 0; j < M; j++) STR printf("\n");    }}void printnn(float a[N][N]) {    int i,    j;    for (i = 0; i < N; i++) {        for (j = 0; j < N; j++) STR printf("\n");    }}void printmn(float a[m][N]) {    int i,    j;    for (i = 0; i < M; i++) {        for (j = 0; j < N; j++) STR printf("\n");    }}void printnm(float a[m][N]) {    int i,    j;    for (j = 0; j < N; j++) {        for (i = 0; i < M; i++) STR printf("\n");    }}int HouseM(int jj) {    int i,    j;    double r;    float x[m],    u1[m][m];    for (i = 0; i < M; i++) x = 0.0;    for (i = jj; i < M; i++) x = A[jj];    r = arraym(x, M);    x[jj] -= r;    r = arraym(x, M);    if (r <= F) return 0;    for (i = jj; i < M; i++) x /= r;    Imm(u1);    for (i = jj; i < M; i++) for (j = jj; j < M; j++) u1[j] += x * x[j] * ( - 2);    mmmn2(u1, A);    mmmm1(U, u1);    return 1;}int HouseN(int jj) {    int i,    j,    k;    double r;    float x[N],    v1[N][N];    k = jj + 1;    for (i = 0; i < N; i++) x = 0.0;    for (i = k; i < N; i++) x = A[jj];    r = arraym(x, N);    x[k] -= r;    r = arraym(x, N);    if (r <= F) return 0;    for (i = k; i < N; i++) x /= r;    Inn(v1);    for (i = k; i < N; i++) for (j = k; j < N; j++) v1[j] += x * x[j] * ( - 2);    mnnn1(A, v1);    nnnn1(V, v1);    return 1;}void Givens(void) {    int k;    float a,    b,    r,    g1[m][m],    g2[N][N];    a = A[p][p] * A[p][p] - miu();    b = A[p][p] * A[p][p + 1];    r = a * a + b * b;    r = sqrt(r);    Inn(g2);    g2[p][p] = a / r;    g2[p + 1][p + 1] = g2[p][p];    g2[p + 1][p] = b / r;    g2[p][p + 1] = -g2[p + 1][p];    mnnn1(A, g2);    nnnn1(V, g2);    for (k = p; k < q; k++) {        a = A[k][k];        b = A[k + 1][k];        r = a * a + b * b;        r = sqrt(r);        Imm(g1);        g1[k][k] = a / r;        g1[k + 1][k + 1] = g1[k][k];        g1[k][k + 1] = b / r;        g1[k + 1][k] = -g1[k][k + 1];        mmmn2(g1, A);        g1[k][k + 1] = g1[k + 1][k];        g1[k + 1][k] = -g1[k][k + 1];        mmmm1(U, g1);        if (k < q - 1) {            a = A[k][k + 1];            b = A[k][k + 2];            r = a * a + b * b;            r = sqrt(r);            Inn(g2);            g2[k + 1][k + 1] = a / r;            g2[k + 2][k + 2] = g2[k + 1][k + 1];            g2[k + 2][k + 1] = b / r;            g2[k + 1][k + 2] = -g2[k + 2][k + 1];            mnnn1(A, g2);            nnnn1(V, g2);        }    }}void paixu(void) {    int i,    j,    k,    h;    float t;    for (i = 0; i < M; i++) for (j = 0; j < N; j++) if (fabs(A[j]) <= F * 10) A[j] = 0.0;    for (i = 0; i < M; i++) for (j = 0; j < M; j++) if (fabs(U[j]) <= F * 10) U[j] = 0.0;    for (i = 0; i < N; i++) for (j = 0; j < N; j++) if (fabs(V[j]) <= F * 10) V[j] = 0.0;    for (i = 0; i < N - 1; i++) {        k = i;        for (j = i + 1; j < N; j++) if (A[j][j] > A[k][k]) k = j;        if (k > i) {            t = A;            A = A[k][k];            A[k][k] = t;            for (h = 0; h < M; h++) {                t = U[h];                U[h] = U[h][k];                U[h][k] = t;            }            for (h = 0; h < N; h++) {                t = V[h];                V[h] = V[h][k];                V[h][k] = t;            }        }    }}void main(void) {    int i,    j;#ifdef T    for (i = 0; i < N; i++) for (j = 0; j < M; j++) {        printf("A[%d][%d]=", i + 1, j + 1);        scanf("%f", &A[j]);    }    printf("A=\n");    printnm(A);#    else for (i = 0; i < M; i++) for (j = 0; j < N; j++) {        printf("A[%d][%d]=", i + 1, j + 1);        scanf("%f", &A[j]);    }    printf("A=\n");    printmn(A);#endif Imm(U);    Inn(V);    for (j = 0; j < N; j++) {        HouseM(j);        if (j < N - 2) HouseN(j);    }    p = 0;    q = N - 1;    while (q > 0) {        line1: for (i = p; i < q; i++) if (fabs(A) <= F * (fabs(A) + fabs(A))) A = 0.0;        for (i = q; i > 0; i--) if (fabs(A) > F) break;        q = i;        for (i = q; i > 0; i--) if (fabs(A) <= F) break;        p = i;        if (q == 0) break;        for (i = p; i < q; i++) if (fabs(A) <= F * fanshu()) {            A = 0.0;            goto line1;        }        Givens();    }    paixu();#ifdef T printf("U'AV=\n");    printnm(A);    printf("U=\n");    printnn(V);    printf("V=\n");    printmm(U);#    else printf("U'AV=\n");    printmn(A);    printf("U=\n");    printmm(U);    printf("V=\n");    printnn(V);#endif}

0 0
原创粉丝点击