보조 인자 행렬


18

보조 인자 행렬은 Adjugate Matrix 의 전치입니다 . 이 행렬의 요소 는 원래 행렬 의 보조 인자 입니다.

보조 인자 여기에 이미지 설명을 입력하십시오(즉, 열 i 및 열 j의 보조 인자 행렬의 요소)는 원래 행렬에서 i 번째 행과 j 번째 열을 삭제하고 (-1) ^ (i + j)를 곱한 하위 행렬의 결정 요인입니다.

예를 들어 행렬의 경우

여기에 이미지 설명을 입력하십시오

행 1과 열 2의 보조 계수 행렬의 요소는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

당신은 행렬의 결정이 방법을 계산하는 것에 대한 정보를 찾을 수 있습니다 여기를 .

도전

목표는 입력 행렬의 보조 인자 행렬을 출력하는 것입니다.

참고 : 보조 인자 행렬, 보조 행렬 또는 결정 요인 또는 이와 유사한 항목을 평가하는 내장 기능이 허용 됩니다.

입력

매트릭스는 명령 행 인수, 함수 매개 변수로 STDIN또는 사용하는 언어에 가장 적합한 방식으로 입력 될 수 있습니다.

행렬은 목록의 목록으로 구성되며, 각 하위 목록은 한 행에 해당하며 여기에는 왼쪽에서 오른쪽으로 정렬 된 요소가 포함됩니다. 목록에서 행이 위에서 아래로 정렬됩니다.

예를 들어 행렬

a b
c d

로 표시됩니다 [[a,b],[c,d]].

그것은 언어에 맞는 감각적 인 경우 (예를 들어 다른 뭔가 대괄호와 쉼표를 대체 할 수있다 ((a;b);(c;d)))

행렬 에는 정수만 포함 됩니다 (음수 일 수 있음) .

행렬은 항상 정사각형입니다 (예 : 동일한 수의 행과 열).

입력이 항상 정확하다고 가정 할 수 있습니다 (즉, 서식 문제가없고 정수 이외의 것은 없으며 빈 행렬이 없음).

산출

결과 보조 계수 행렬은로 출력 STDOUT되거나, 함수에서 반환되거나, 파일에 쓰여지거나, 사용하는 언어에 자연스럽게 적합한 유사한 것으로 출력 될 수 있습니다 .

보조 계수 행렬은 입력 행렬과 같은 방식으로 형식화해야합니다 (예 :) [[d,-c],[-b,a]]. 문자열을 읽으면 입력에서와 같이 형식이 지정된 문자열을 반환 / 출력해야합니다. 예를 들어 목록 목록과 같은 것을 입력으로 사용하는 경우 목록 목록도 반환해야합니다.

테스트 사례

  • 입력: [[1]]

산출: [[1]]

  • 입력: [[1,2],[3,4]]

산출: [[4,-3],[-2,1]]

  • 입력: [[-3,2,-5],[-1,0,-2],[3,-4,1]]

산출: [[-8,-5,4],[18,12,-6],[-4,-1,2]]

  • 입력: [[3,-2,7,5,0],[1,-1,42,12,-10],[7,7,7,7,7],[1,2,3,4,5],[-3,14,-1,5,-9]]

산출:

[[9044,-13580,-9709,23982,-9737],[-1981,1330,3689,-3444,406],[14727,7113,2715,-9792,414],[-28448,-2674,-707,16989,14840],[-2149,2569,-2380,5649,-3689]]

채점

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


2
인수에서 입력을 받고 값을 반환하는 함수 제출에 입력 행렬이 제공되는 것과 동일한 방식으로 보조 인자 행렬 을 해석 하는 방법을 잘 모르겠습니다 . 실제 행렬이나 문자열 표현을 읽거나 반환합니까?
Dennis

1
한마디로 : 문자열을 읽으면 입력과 똑같이 행렬의 형식이 지정된 문자열을 반환 / 출력해야합니다. 예를 들어 목록 목록과 같은 것을 사용하는 경우 목록 목록도 반환해야합니다.
페이탈 라이즈

1x1 행렬에 실제로 보조 인자 행렬이 있습니까?
Liam

또한 실수하지 않은 한 두 번째 테스트 사례는 adjugate matrix (필요한 것의 전치) 인 것처럼 보입니다.
Liam

@ICanHazHats 맞습니다, 고마워요.
페이탈 라이즈

답변:


1

J, 29 바이트

3 :'<.0.5+|:(-/ .**%.)1e_9+y'

동일한 엡실론 / 역 / 결정적 트릭. 오른쪽에서 왼쪽으로 :

  • 1e_9+ 엡실론을 추가하고
  • (-/ .**%.)행렬식 ( -/ .*) 시간의 역수 ( %.)
  • |: 조옮김
  • <.0.5+ 반올림.

5

Matlab, 42 33 바이트

익명 함수 사용하기 :

@(A)round(inv(A+eps)'*det(A+eps))

입력 및 출력은 행렬 (2D 숫자 형 배열)입니다.

eps행렬이 단수 인 경우 추가됩니다. 사용하여 "제거"됩니다 round(실제 결과는 정수임).

예:

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)'*det(A+eps))
>> ans([-3,2,-5; -1,0,-2; 3,-4,1])
ans =
-8    -5     4
18    12    -6
-4    -1     2

특이 행렬의 예 :

>> @(A)round(inv(A+eps)'*det(A+eps))
ans = 
    @(A)round(inv(A+eps)*det(A+eps)')
>> ans([1,0 ; 0,0])
ans =
     0     0
     0     1

또는 옥타브에서 온라인으로 사용해보십시오 .


2
그러나 나는 도전에서 이야기하지 않은 것에 대해 우려하고 있습니다.이 답변은 입력 행렬이 뒤집을 수 없다고 가정합니다. 말에 코드를 사용하여 [1,0 ; 0,0]오류를 줄 때 그것은 출력합니다[0,0 ; 0,1]
Fatalize

1
함수에서 복귀하기 때문에 mat2str"
공인 계수

1
@FryAmTheEggman 감사합니다! 그러나 " 공인 수 행렬은 입력 행렬이 제공되는 것과 동일한 방식으로 형식화되어야합니다 ". 그것이 내가 필요하다고 생각하는 이유입니다.mat2str
Luis Mendo

1
@ 페이탈 라이즈 그렇습니다. eps약 1e-16입니다. 따라서 행렬을 단수로 만들지 만 조건이 좋지 않습니다. 결과는 정확히 정수가 아닙니다. 그래서 fix(0으로 반올림)으로 수정합니다. 오류가를 초과하지 않으면 작동합니다 .5. 보장이없는 것 같습니다. 매우 큰 정수의 경우 실패 할 수 있습니다. 나는 그것이 더러운 속임수 라고 말했다 : -P
Luis Mendo

1
명확성을 위해 @Fatalize, mat2str여기에 필요한지 말할 수 있습니까? 이것은 함수이기 때문에 실제로 입력은 형식화되지 않은 행렬입니다. 시도 f=...하면 f(f(...))이렇게 작동하지 않지만 제거 mat2str하면 제대로 작동합니다.
FryAmTheEggman


3

R, 121 94 바이트

function(A)t(outer(1:(n=NROW(A)),1:n,Vectorize(function(i,j)(-1)^(i+j)*det(A[-i,-j,drop=F]))))

이것은 클래스의 객체를 받아들이고 matrix다른 객체를 반환 하는 터무니없이 긴 함수입니다 . 호출하려면 변수에 지정하십시오.

언 골프 드 :

cofactor <- function(A) {
    # Get the number of rows (and columns, since A is guaranteed to
    # be square) of the input matrix A
    n <- NROW(A)

    # Define a function that accepts two indices i,j and returns the
    # i,j cofactor
    C <- function(i, j) {
        # Since R loves to drop things into lower dimensions whenever
        # possible, ensure that the minor obtained by column deletion
        # is still a matrix object by adding the drop = FALSE option
        a <- A[-i, -j, drop = FALSE]

        (-1)^(i+j) * det(a)
    }

    # Obtain the adjugate matrix by vectorizing the function C over
    # the indices of A
    adj <- outer(1:n, 1:n, Vectorize(C))

    # Transpose to obtain the cofactor matrix
    t(adj)
}

80 바이트를 사용하는 mapply대신 outerVectorize
주세페

2

, 246 바이트

트리플 중첩 for 루프에 의해 이것이 좋은 코딩임을 알 수 있습니다.

꽤 간단합니다. GAP에는 다른 수학 지향 언어와 같은 행렬을 처리하는 도구가 실제로 없습니다. 여기서 실제로 사용되는 것은 내장 결정 연산자입니다.

f:=function(M)local A,B,i,j,v;A:=StructuralCopy(M);if not Size(M)=1 then for i in [1..Size(M)] do for j in [1..Size(M)] do B:=StructuralCopy(M);for v in B do Remove(v,j);od;Remove(B,i);A[i][j]:= (-1)^(i+j)*DeterminantMat(B);od;od;fi;Print(A);end;

언 골프 :

f:=function(M)
    local A,B,i,j,v;
    A:=StructuralCopy(M);
    if not Size(M)=1 then
        for i in [1..Size(M)] do
            for j in [1..Size(M)] do
                B:=StructuralCopy(M);
                for v in B do
                    Remove(v,j);
                od;
                Remove(B,i);
                 A[i][j]:= (-1)^(i+j)*DeterminantMat(B);
            od;
        od;
    fi;
    Print(A);
end;

1

상세 v2 , 196 바이트

IncludeTypePackage<Matrix>
IncludeTypePackage<OutputSystem>
print=OutputSystem:NewOutput<DEFAULT>
input=Matrix:Adjugate<ARGV0>
input=Matrix:Transpose<input>
OutputSystem:DisplayAsText<print;input>

온라인으로 사용해보십시오!

NB : 현재 TIO에서는 작동하지 않습니다. 오프라인으로 작동해야합니다

((a b)(c d))나타내는 형식 으로 입력을받습니다.

[]

어보 게이트를위한 내장 기능이 있음에도 불구하고, Verbosity의 자세한 기능은 여전히이를 손상시킵니다. 기본적으로 작동 방식은 입력의 조정을 바꿉니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.