내일 1교신데 ㅠㅠ 더 늦으면 못갈까봐 자러갑니다 <div><br></div> <div>pivoting이 문제인데 ax=b에서 a는 피보팅이 되는데 b가 안되네요</div> <div><br></div> <div>전체코드는</div> <div><br></div> <div><div>#include <stdio.h></div> <div>#include <iostream></div> <div>#include <math.h></div> <div><br></div> <div>void create_mat(float*** _mat, int _row, int _col);</div> <div>void init_mat(float** _mat, int _row, int _col, float _val);</div> <div>void print_mat(float** _mat, int _row, int _col);</div> <div><br></div> <div>void get_mat_val(float** _mat, int _row, int _col);</div> <div>void pivoting(float** _matA, float** _matb, float **pivot, int _row, int _col);</div> <div>void gausselimination(float ** _matA, float ** _matb, float **_mult, int _row, int _col);</div> <div>void backward_substitution(float **_matA, float **_matb, float **matx, int _row, int _col);//A와 b를 넣으면 행렬 x를 구함.</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span> </div> <div>/*</div> <div>void LUdecomp(float** X)</div> <div>void matinv(float** X)</div> <div>*/</div> <div><br></div> <div><br></div> <div><br></div> <div>void main()<span class="Apple-tab-span" style="white-space:pre;"> </span>//main 시작---------------</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//1. declare variables; get matrix size from user;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int M;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int _row, _col;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "Ax=b; A(M*M); x(M*1); b(M*1);\n Enter Matrix size M :";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cin >> M;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>float **matA;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>float **matb;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>float **matx;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>float **mult;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>float **pivot;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_row = M;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_col = M;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>create_mat(&matA, _row, _col);<span class="Apple-tab-span" style="white-space:pre;"> </span>// function create_mat 실행</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>create_mat(&matb, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>create_mat(&matx, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>create_mat(&mult, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>create_mat(&pivot, 1, _col+1);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>init_mat(matA, _row, _col, 0);<span class="Apple-tab-span" style="white-space:pre;"> </span>// function init_mat 실행</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>init_mat(matb, _row, 1, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>init_mat(matx, _row, 1, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>init_mat(mult, _row, _col, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>init_mat(pivot, 1, _col+1, 0);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//2. enter matrix values; get matrix values from user;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "\nInput matrix A\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>get_mat_val(matA, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "Printing matrix A : \n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(matA, _row, _col);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "\nInput matrix b\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>get_mat_val(matb, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "Printing matrix b : \n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(matb, _row, 1);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(matb, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "\n";</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//3. pivoting</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>pivoting(matA, matb, pivot, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cout << "\nPivoted A,b\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(matA, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(matb, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>print_mat(pivot, 1, _col + 1);</div> <div><br></div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//GaussElimination</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>gausselimination(matA, matb, mult, _row, _col);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//std::cout << "\nGauss ellimination A\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//print_mat(matA, _row, _col);<span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//std::cout << "\nmult array\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//print_mat(mult, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//std::cout << "permutaion b\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//print_mat(matb, _row, 1);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//backwardsubstitution</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>backward_substitution(matA, matb, matx, _row, _col);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//std::cout << "x\n";</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//print_mat(matx, _row, 1);</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//LU decomposition 쉽다 나중에 만들자</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//void LUdecomp(float** X)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//Inverse matrix</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>//void matinv(float** X)</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>system("pause");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(matA);<span class="Apple-tab-span" style="white-space:pre;"> </span>// Free allocated memory when program ends</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(matb);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(matx);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(mult);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>free(pivot);</div> <div>}<span class="Apple-tab-span" style="white-space:pre;"> </span>//main 끝-----------------------------</div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div><br></div> <div>// 사용자에게 받은 row와 col값 이용, 삼중포인터 mat에 배열을 만들어서 주소를 저장시킴</div> <div>void create_mat(float*** _mat, int _row, int _col) </div> <div>{</div> <div> int i;</div> <div> /* 1. allocate row first */</div> <div> *_mat = (float**)malloc(sizeof(float) * (_row));</div> <div> /* 2. allocate column */</div> <div> for (i = 0; i < _row; i++)</div> <div> (*_mat)[i] = (float*)malloc(sizeof(float) * (_col));</div> <div>}// matrix 생성 함수; m*m 크기로 생성</div> <div><br></div> <div>// 만들어진 배열에 저장되어있는 쓰레기값들을 버리고 지정한 어떤 수 _val로 초기화</div> <div>void init_mat(float** _mat, int _row, int _col, float _val)</div> <div>{</div> <div> int i, j;</div> <div> for (i = 0; i < _row; i++)</div> <div> {</div> <div> for (j = 0; j < _col; j++)</div> <div> (_mat)[i][j] = _val;</div> <div> }</div> <div>}</div> <div><br></div> <div>// 배열에 저장되어있는 값들을 출력; 행렬 출력</div> <div>void print_mat(float** _mat, int _row, int _col)</div> <div>{</div> <div> int i, j;</div> <div> for (i = 0; i < _row; i++)</div> <div> {</div> <div> for (j = 0; j < _col; j++)</div> <div> printf("%f, ", _mat[i][j]);</div> <div> printf("\n");</div> <div> }</div> <div> printf("==== ==== ==== ==== ==== ==== ==== ====\n");</div> <div>}// matrix 프린트 함수;</div> <div><br></div> <div>// 사용자에게서 입력을 받아서 만들어진 배열에 값을 저장</div> <div>void get_mat_val(float** _mat, int _row, int _col)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("Enter the matrix values\n");</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int i,j;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (i=0; i<_row; i++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("row[%d]\n",i);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for(j = 0; j <_col; j++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("[%d][%d]=",i,j);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>std::cin >> _mat[i][j];<span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("\n");</div> <div>}</div> <div><br></div> <div>void pivoting(float **_matA, float **_matb, float **pivot, int _row, int _col)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int i, j, K,R;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (K = 0; K < _row; K++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>if (_matA[K][K] == 0)//<pivoting</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (j = 0; j < _col; j++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>pivot[0][j] = _matA[K][j];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>pivot[0][_col] = _matb[K][0];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (i = 1; i < _col - K && _matA[K + i][K] != 0; i++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>R = i + K;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>printf("%d", R);</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (j = 0; j < _col; j++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matA[K][j] = _matA[R][j];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matb[K][0] = _matb[R][0];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matA[R][j] = pivot[0][j];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matb[R][0] = pivot[0][_col];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}//pivoting></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>// Ax=b에서 'A와 'b'에 해당하는 행렬의 주소값을 받아서, A와 b에가우스 소거법을 적용</div> <div>void gausselimination(float **_matA, float **_matb, float **_mult, int _row, int _col)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int K;</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int i, j;</div> <div><br></div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (K = 0; K < _row; K++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (i = K + 1; i < _row; i++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_mult[i][K] = (_matA[i][K] / _matA[K][K]); // mult 값은 열과 상관없으므로 연산을 줄이기위해 앞으로 뺌</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matb[i][0] = _matb[i][0] - _mult[i][K] * _matb[K][0]; //A행렬의 연산을 b행렬에도 적용</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (j = K + 1; j < _col; j++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matA[i][j] = _matA[i][j] - _mult[i][K] * _matA[K][j];//row[i]의 2번째 3...번째 값들</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matA[i][K] = 0; //A[K][K]와 같은 열에 있는 값들 중 더 낮은 row의 값들은 연산 후 0이 될 것임.</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>// Ax=b에서 행렬 A가 upper triangular matrix일 때, backward substitution을 사용하여 x를 계산</div> <div>void backward_substitution(float **_matA, float** _matb, float** _matx, int _row, int _col)</div> <div>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>int i, j;</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (i = 0; i < _row; i++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matx[i][0] = _matb[i][0];// 현재 행렬 b의 데이터를 건드리지 않기 위해 행렬 x로 옮김</div> <div><br></div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (i = _row-1; i >=0; i--) //backward substituion 진행</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matx[i][0] = _matx[i][0] / _matA[i][i];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>for (j = 1;j< _row-i; j++)</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>{</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>_matx[i][0] = _matx[i][0] - (_matA[i][i + j] * _matx[i + j][0]) / _matA[i][i];</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div><span class="Apple-tab-span" style="white-space:pre;"> </span>}</div> <div>}</div> <div><br></div> <div>/*Ax=b A=LU; should be acting after GaussElimination L=mult+E(_row) U=Gausseliminated 'A'</div> <div>void LUdecomp(float** X)</div> <div>{</div> <div><br></div> <div>mult+E -> L</div> <div>Gausseliminated A -> U</div> <div><br></div> <div>}</div> <div>*/</div> <div><br></div> <div>/*</div> <div>void matinv(float** X)</div> <div>{</div> <div><br></div> <div><br></div> <div><br></div> <div>}</div> <div>*/</div></div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.