2014-04-20 12 views
0

저는 대학원생이고 교수 중 한 명이 자신의 기능을 "쉽게"코드화 할 수있을 때 "블랙 박스"기능을 사용하는 것을 학생들이 좋아하지 않습니다.Matlab Matrix Inversion

그래서 Matlab에서는 일반적으로 입력 행렬 (아마도 100x100에서 500x500 크기)의 역행렬을 취할 수있는 함수를 작성할 수 있어야합니다. 필자가 가지고있는 유일한 지침은 "반복적 인 방법을 사용하는 것이 좋습니다. 반면에 함수 입력은 반전하려는 행렬과 허용 가능한 오류 량을 지정해야합니다. 원하는 오류 추정기를 사용할 수 있습니다."

주위를 둘러 보면서 A^-1 (Gauss-Seidel 방법을 생각해보십시오.)를 해결하는 것과는 대조적으로 Ax = b를 직접 풀 수있는 많은 추정 기법을 발견했습니다. 내가 가진 유일한 힌트는 위 삼각형, 대각선 및 하위 삼각형 요소로 입력 행렬을 해체 한 다음 어떻게 든 개별적으로 그것을 뒤집는 것이 유용 할 수 있다는 것입니다.

분명히, 나는 누군가가 나에게 코드를 줄 것으로 기대하지 않는다. 누군가가 저에게 Matlab 코드로 형성 할 수있는 일종의 기본적인 수치 행렬 반전 기술을 제공 할 좋은 리소스를 갖고 있다면 제가 원하는 것은 무엇입니까.

+3

연구를 위해 반전을 위해 자신의 알고리즘을 사용하기를 원한다면, 나는 그와 싸울 것입니다. – chessofnerd

+0

이것이 아닌 경우 운동을 벌이고, 그럼. 그러나 사람들이 표준 소프트웨어 패키지를 사용하여 이와 같은 작업을 수행하는 데는 좋은 이유가 있습니다. – AnonSubmitter85

+1

그것은 수업을위한 것이지 연구가 아닙니다. 그게 내가 할 수있는 유일한 이유 야. – user2785214

답변

0

Gauss-Jordan Elimination (http://mathworld.wolfram.com/Gauss-JordanElimination.html 참조)이 트릭을 수행 할 수 있습니다. 이것은 사소한 구현은 아니지만 약간의 노력을 기울여야 제대로 작동 할 것입니다. [AI]와

  • 시작

    [A11 A12 A13 : 1 0 0] 참고 다음은 알고리즘의 매우비공식적 스케치입니다

    [A21 A22 A23 : 0 1 0]

    [A31 A32 A33 :

  • 0 0 1]

    은 A21/A11 추가 * R

    [0 XXX의 YYY : RST]

    [A31 A32 A33 : 0 0 1]

    • 음주 : ow1는

    [1 0 0 A11 A12 A13]을 ROW2 할 세 번째 행과 같은 것 (ie. a31/a11 * row1을 row3에 추가하십시오.

이전 단계를 수행 한 후 첫 번째 열에 0이 오면 a11을 선도 할 것입니다.

  • 이제 row22에 a22/a32 * row2를 추가하십시오. a32가 0으로 변경됩니다. 다음 행에서 모두 반복하십시오.

  • 모든 LARGER 열에 대해 이전 단계를 반복하십시오.

3x3보다 큰 matricies에서 작동하려면이 방법을 일반화해야하지만 패턴은 단순해야합니다. 1-5 단계를 완료하면 상단 삼각형 행렬이 남습니다. 이제, 당신은 뒤로 거슬러 올라갑니다.행 3의 일부를 행 1과 2에 추가하여 세 번째 열을 0으로 변경 한 다음 행 2의 일부분을 행 1의 열을 0으로 변경합니다 (다시 한번 X X 행렬에서 작동하도록 일반화합니다 .

는이 완료되면, 당신은 왼쪽 대각 행렬로 남아있을 것입니다. 단위 행렬로 변경 것이다 요인에 의해 각 행을 곱하십시오.

오른쪽의 결과는 거꾸로 행렬 ! 당신은 받아 들일 수있는 오류를 이것에 통합하는 방법을 찾아야 할 것입니다.

+0

이것은 아름답게 작동했으며 500x500 매트릭스의 Matlab의 "inv"기능보다 약 100 배 더 느리다. 도와 주셔서 감사합니다! – user2785214

+0

내 기쁨! 100 배속 문제는 나에게 전혀 놀랄 일이 아니며, 이것이 교실 운동 일 뿐이 기 때문에 기쁘다. '진짜'inv 함수는 아마 하드 코어 알고리즘 개발자 팀이 끝없이 최적화, 연마 및 연마하기 위해 작성한 것입니다. 우리가 무언가를 함께 해킹 할 때 (: – chessofnerd