0

行列 A の非常に簡単なインプレース LU 分解を実装する必要があります。ガウス消去法を使用しており、3x3 行列でテストしたいと考えています。問題は、stack smashingエラーが発生し続け、その理由がわかりません。これを実行できるコードに問題はありません。何か考えはありますか?

問題はおそらく因数分解ブロックにあります。


###My code:###
#include <stdio.h>

int main() {
    int n = 3; // matrix size

    int A[3][3] = {
        {1, 4, 7},
        {2, 5, 8},
        {3, 6, 10}
    };

    printf("Matrix A:\n");

    for( int i=0; i < n; i++ ) {
        for( int j=0; j < n; j++ ) {
            printf("%d ", A[i][j]);

            if ( j % 2 == 0 && j != 0 ) {
                printf("\n");
            }
        }
    }

    // FACTORIZATION    
    int k;
    int rows;
    for( k = 0; k < n; k++ ) {
        rows = k + k+1;
        A[rows][k] = A[rows][k]/A[k][k];
        A[rows][rows] = A[rows][rows] - A[rows][k] * A[k][rows];
        printf("k: %d\n", k);
    }

    printf("Matrix after decomp:\n");
    for( int i=0; i < n; i++ ) {
        for( int j=0; j < n; j++ ) {
            printf("%d ", A[i][j]);

            if ( j % 3 == 0 && j != 0 ) {
                printf("\n");
            }
        }
    }

    return 0;
}
4

2 に答える 2

6

あなたのエラーはおそらくここにあります:

rows = k + k+1;
A[rows][k] = A[rows][k]/A[k][k];
A[rows][rows] = A[rows][rows] - A[rows][k] * A[k][rows];

これはrows、値 1、3、5 を通過することを意味します。次に、要素が 3 つしかない配列にアクセスするために使用されます。それらの唯一の有効なオフセットは1であるため、実際にはオーバーフローします。

EDIT : あなたの Matlab コードを見ると、小さなベクトルへのrows = k + 1:nセットとして、完全に異なることを行っています。これはrows、マトリックスのスプライスを使用します。C はプリミティブとしてサポートされていません。A(rows, k) * A(k, rows)明示的なループを使用して、それと行列乗算の両方を再実装する必要があります。

于 2015-01-28T00:19:31.300 に答える