Een*_*oku 0 c stack-smash matrix-decomposition
我需要实现一个非常简单的矩阵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;
}
Run Code Online (Sandbox Code Playgroud)
您的错误很可能在这里:
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];
Run Code Online (Sandbox Code Playgroud)
这意味着rows经过值1,3,5; 然后用于访问只有三个元素的数组.这确实会溢出,因为这些中唯一有效的偏移是1.
编辑:看看你的Matlab代码,它正在做一些完全不同的事情,因为rows = k + 1:n设置rows为一个小向量,然后它使用拼接矩阵,C不支持作为基元.您需要A(rows, k) * A(k, rows)使用显式循环重新实现它和矩阵乘法.