2012-09-02 1 views
1

MatLab에 입력을 삼각 행렬로 취하는 알고리즘을 작성하려고합니다. 출력은이 행렬의 역함이어야합니다 (또한 삼각형 형태 여야합니다). 나는 거의 이것을 해결할 수 있었지만, 알고리즘의 한 부분은 여전히 ​​내 머리를 긁적이게한다. 지금까지 내가 가지고있는 것 :MatLab - 행렬의 역함수를 찾는 알고리즘

function AI = inverse(A) 
n = length(A); 
I = eye(n); 
AI = zeros(n); 
for k = 1:n 
    AI(k,k) = (I(k,k) - A(k,1:(k-1))*AI(1:(k-1),k))/A(k,k); 
    for i = k+1:n 
     AI(i,k) = (I(i,k) - (??????????????))/A(i,i); 
    end 
end 

나는 확신 할 수없는 부분에 물음표로 표시했다. 나는이 코드의 부분을 종이에 그 절차를 써서 패턴을 찾으려고 노력했지만,이 부분을 해결할 적절한 방법을 찾을 수없는 것 같다.

누구든지 나를 도울 수 있다면, 나는 매우 감사 할 것입니다!

+0

왜 inv (A)를 사용할 수 없습니까? –

+0

@diophantine : 알고리즘의 핵심을 배우려고하기 때문에 :). 그리고 위에 게시 한 문제는 내 교과서에서 주어진 연습입니다. 물론, 나는 단지 inv (A)를 사용할 수 있다는 것을 알고 있지만 처음부터 알고리즘을 만드는 법을 배우는 것은 현재 취하고있는 과정의 목표입니다. – Kristian

답변

3

여기 로우 변환을 이용하여 하부 삼각 행렬의 역행렬을 얻는 내 코드 : 모든 입력

function AI = inverse(A) 
    len = length(A); 
    I = eye(len); 
    M = [A I]; 
    for row = 1:len 
     M(row,:) = M(row,:)/M(row,row); 
     for idx = 1:row-1 
      M(row,:) = M(row,:) - M(idx,:)*M(row,idx); 
     end 
    end 
    AI = M(:,len+1:end); 
end 
1

Octave's source에서 어떻게 완료되었는지 확인할 수 있습니다. 이는 행렬의 클래스에 따라 다른 위치에서 구현되는 것으로 보입니다. 플로트 타입 대각선 행렬에 대해서는 liboctave/array/fDiagMatrix.cc이고, 복잡한 대각선 행렬은 liboctave/array/CDiagMatrix.cc 등입니다 ...

무료 (자유) 소프트웨어의 장점 중 하나는 사물이 어떻게 구현되는지 자유롭게 학습 할 수 있다는 것입니다.

+0

링크를 제공해 주셔서 감사합니다. 나는 이것을 조사 할 것이다. – Kristian

0

감사합니다 입력이 낮은 삼각형 행렬 인 경우, 실제로이 문제를 해결할 수있는 아주 좋고 쉬운 방법을 찾을 수있었습니다.

function AI = inverse(A) 
n = length(A); 
I = eye(n); 
AI = zeros(n); 
for k = 1:n 
    for i = 1:n 
     AI(k,i) = (I(k,i) - A(k,1:(k-1))*AI(1:(k-1),i))/A(k,k); 
    end 
end