JavaScript에서 2x2 역행렬 함수 작성

다음과 같은 2x2 행렬의 역수를 계산하는 단계:



이다:
  • 행렬의 왼쪽 위 요소와 오른쪽 아래 요소를 바꿉니다
  • .
  • 나머지 두 요소를 무효화합니다
  • .
  • 다음 공식을 사용하여 결정자를 계산합니다.(ad - bc)
  • 행렬의 각 요소에 1 /determinate를 곱합니다.

  • 따라서 역함수는 다음과 같이 계산할 수 있습니다.



    알고리즘으로 구현하기 위해 행렬은 2배열의 배열로 표현됩니다. 예: [[a,b], [c,d]]

    첫 번째 단계는 [0][0][1][1]를 바꾸는 것입니다.

    let temp = [0][0];
    matrix[0][0] = matrix[1][1];
    matrix[1][1] = temp;
    


    그런 다음 2단계에서 [0][1][1][0] 인 마지막 남은 요소를 부정해야 합니다. 단순히 -1를 곱하여 부정할 수 있습니다.

    matrix[0][1] *= -1;
    matrix[1][0] *= -1;
    

    a *= -1a = a * -1를 쓰는 또 다른 짧은 방법입니다.

    공식ad - bc을 사용하여 확정값을 계산합니다.
    이 단계는 간단한 계산입니다.

    let determinate = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    


    마지막 단계는 각 요소에 1/determinate를 곱하여 쉽게 수행할 수 있습니다.

    matrix[0][0] *= (1/determinate);
    matrix[0][1] *= (1/determinate);
    matrix[1][0] *= (1/determinate);
    matrix[1][1] *= (1/determinate);
    


    내장된 map() , flat()splice() 함수를 사용하여 이 단계를 더 멋진 문장으로 리팩터링할 수 있습니다.

    const flatMapped = matrix.flat().map(el => el * 1/determinate);
    matrix = [flatMapped.splice(0, 2), flatMapped.splice(0, 2)];
    


  • 첫 번째 명령문은 예를 들어 배열을 평면화합니다. [[a,b], [c,d]]에서 [a,b,c,d]로 변환한 다음 각 요소에 결정자를 곱합니다.

  • 두 번째 진술은 이해하기 약간 까다롭습니다. splice() 함수는 배열에서 요소를 삭제하고 첫 번째 매개변수로 시작 인덱스를 사용하고 선택적 삭제 수를 두 번째 매개변수로 사용하여 배열로 반환합니다.
  • [[a,b][c,d]] 형식으로 되돌리기 위해 처음 2개 요소(인덱스 0에서 시작)에 대해 splice()를 호출하여 제거하고 행렬에 추가합니다.
  • 그러나 splice()에 대한 첫 번째 호출이 ab 요소를 제거했기 때문에 cd만 남습니다(splice()는 변경 가능). 마지막 2개의 요소를 가져와 반환할 행렬에 푸시합니다.


  • 이제 모든 단계를 결합하여 기능을 생성할 수 있습니다calculateInverse.

    function calculateInverse(matrix) {
    
        // Step 1 - Swap a and d
        let temp = [0][0];
        matrix[0][0] = matrix[1][1];
        matrix[1][1] = temp;
    
        // Step 2 - Negate b and c 
        matrix[0][1] *= -1;
        matrix[1][0] *= -1;
    
        // Step 3 - Calulate determinate
        let determinate = (matrix[0][0] * matrix[1][1]) - (matrix[0][1] * matrix[1][0]);
    
        // Step 4 - Multiply indices by 1/determinate
        const flatMapped = matrix.flat().map(el => el * 1/determinate);
        matrix = [flatMapped.splice(0, 2), flatMapped.splice(0, 2)];
    
        return matrix
    }
    


    참고: 이 기능은 2x2 매트릭스에서만 작동합니다. 더 큰 행렬의 역행렬을 계산하기 위한 추가 요구 사항이 있습니다.

    우리의 기능을 향상시키기 위해 가능한 다음 단계:
  • 전달된 인수가 2개 요소의 2개 배열을 포함하는 배열인지 확인하기 위해 몇 가지 검사를 추가합니다
  • .
  • 배열의 요소가 숫자인지 확인
  • 확정 값이 0이고 인덱스에 반전이 없으면 이 시나리오에 대한 검사를 추가할 수 있습니다.
  • 행렬 인덱스를 별도의 인수로 전달할 수 있도록 함수 변경(힌트: ...args)
  • 원래 배열이 수정되지 않도록 4단계를 변경합니다(힌트: 슬라이스)

  • 읽어 주셔서 감사합니다 :)

    연결:
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
  • 좋은 웹페이지 즐겨찾기