next up previous
Next: A. ソース Up: 1 matrix ライブラリィ Previous: 1.4.2 よくある間違い

1.5 matrix ライブラリィを使用したプログラムの例


#include <stdio.h>
#include <matrix.h>

main()
{
    int i, j, n;
    vector u, v, bj;
    matrix a, b, c;

    printf("n="); scanf("%d", &n);

    /* n 次元のベクトル u, v を準備 */
    if ((u = new_vector(n)) == NULL) {
        fprintf(stderr, "cannot allocate u\n"); exit(1);
    }
    if ((v = new_vector(n)) == NULL) {
        fprintf(stderr, "cannot allocate v\n"); exit(1);
    }
    /* u, v の全成分を 1 にする */
    for (i = 0; i < n; i++) u[i] = v[i] = 1.0;
    /* u, v の内積を計算して表示する */
    printf("dotprod(n, u, v)=%g\n", dotprod(n, u, v));

    /* n 次正方行列 a, b, c を準備 */
    if ((a = new_matrix(n, n)) == NULL) {
        fprintf(stderr, "cannot allocate a\n"); exit(1);
    }
    if ((b = new_matrix(n, n)) == NULL) {
        fprintf(stderr, "cannot allocate b\n"); exit(1);
    }
    if ((c = new_matrix(n, n)) == NULL) {
        fprintf(stderr, "cannot allocate c\n"); exit(1);
    }
    /* n 次元のベクトル bj を準備 */
    if ((bj = new_vector(n)) == NULL) {
        fprintf(stderr, "cannot allocate v\n"); exit(1);
    }
    /* a, b の全成分を 1 にする */
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            a[i][j] = b[i][j] = 1.0;
    for (j = 0; j < n; j++) {
        /* 行列 b の第 j 列ベクトルを bj にコピーする */
        for (i = 0; i < n; i++) bj[i] = b[i][j];
        /* c の (i,j) 成分を a の第 i 行と b の第 j 列の内積とする
         * i.e. 行列 c を行列 a, b の積とする */
        for (i = 0; i < n; i++) c[i][j] = dotprod(n, a[i], bj);
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++)
            printf("%g ", c[i][j]);
        printf("\n");
    }
    return 0;
}

6701 号室の環境でコンパイルするには -lmatrix というリンカー・ オプションをつければよい2
        gcc -o testmat testmat.c -lmatrix -lm

vector は、実際には double へのポインターなので、double 型の配列 double [数] や、double 型へのポインター *double と互換性がある。


next up previous
Next: A. ソース Up: 1 matrix ライブラリィ Previous: 1.4.2 よくある間違い
Masashi Katsurada
平成18年4月29日