두 개의 12x12 행렬이 동일한 결정자를 갖는지 테스트


11

12×12Q

det(Q)=det(12IQJ)(1)
J

나는 현재 armadillo 라이브러리로 이것을하고 있지만 너무 느립니다. 문제는 1 조의 행렬에 대해이 작업을 수행해야하며 두 결정 요인을 계산하는 것이 내 프로그램의 병목 현상이라는 것이 밝혀졌습니다. 따라서 두 가지 질문이 있습니다

  1. 크기를 알면 결정자를 더 빨리 계산하는 데 사용할 수있는 트릭이 있습니까? 이 경우 행렬에 대한 지저분한 확장 일까요?12×12

  2. 평등을 테스트하는 다른 효율적인 방법이 있습니까?(1)

편집하다. 댓글에 답하십시오. 내가 연결된 모든 비 자기 보완 그래프를 계산하는 데 필요한 위해의 이되도록 와 스패닝 트리의 같은 수 있습니다. 이에 대한 동기는이 mathoverflow 게시물 에서 찾을 수 있습니다 . 기계에 관해서는 이것을 8 코어 3.4GHh 기계에서 병렬로 실행하고 있습니다.G13GG¯

편집하다. 행렬의 행렬식 을 구체적으로 계산하기위한 C 프로그램을 만들면 예상 실행 시간을 50 % 줄일 수있었습니다 . 제안은 여전히 ​​환영합니다.12×12


6
너무 느리게? 어떤 하드웨어에 시간이 얼마나 걸립니까? 이 의 수조가 독립적이므로 이러한 많은 결정 요인을 동시에 계산할 수 있습니까? 그렇다면 얼마나 큰 머신을 실행할 수 있습니까? 무엇이이 문제를 일으켰습니까? 결정자를 계산해야합니까? Q
Bill Barth

3
결정 요인이 얼마나 자주 (어떤 비율의 경우에 대해) 동일합니까? 대부분의 시간이 다를 경우, 테스트 결과가 다를 수있는 더 저렴한 테스트가있을 수 있으며 첫 번째 테스트가 실패한 경우에만 동일한 지 확인해야합니다. 그들이 거의 같은 시간이라면 다른 방법입니다.
Wolfgang Bangerth

1
이미 요청했듯이 출처 에 대해 자세히 설명해 주 시겠습니까? 맹목적으로 계산하는 결정 요인보다 더 나은 접근 방법이있을 수 있습니다. Q
JM

4
이 조건이 "수 조의 행렬에 대해"테스트되어야한다는 개념은 1) 가 어떤 특별한 구조를 갖는 것으로 알려져 있다고 미리 말하고 (그렇지 않으면 조건이 임의로 유지한다는 기대는 미미 함) 2) 더 나은 접근법이라는 이 속성을 사용하여 모든 행렬 를 특성화 할 수 있습니다 (효율적으로 검사 가능한 공식화). QQQ
hardmath

1
@hardmath 예, 는 에서 까지의 대각선 항목 과 대각선 요소에서 범위의 정수 행렬1 12 - 1Q1121
Jernej

답변:


8

이미 C ++을 사용하고 있으며 행렬은 대칭 양수 한정이므로 와 의 인수 분해를 수행합니다 . 여기서 도 양의 한정 이라고 가정합니다 . 그렇지 않으면 는 수치 적 안정성을 위해 선회해야 할 것입니다. Q 12 I Q J 12 I Q J L D L TLDLTQ12IQJ12IQJLDLT

이것은 LU 인수 분해보다 빠르며, 제곱근을 피하기 때문에 Cholesky보다 빠릅니다. 결정 요인은 단순히 대각선 행렬 요소의 곱입니다 . LDL 인수 분해를 수행하는 코드는 매우 간단하여 50 줄 미만의 C로 작성할 수 있습니다. Wikipedia 페이지 의 알고리즘에 대해 설명하고 Cholesky를 수행하는 간단한 템플릿 코드가 있습니다 . 인수 분해 를 구현하기 위해 제곱근을 피하도록 크게 단순화하고 수정할 수 있습니다 .L D L TDLDLT

스토리지 형식도 제어 할 수 있으므로 루틴을 더욱 최적화하여 매트릭스의 절반 만 저장하고 선형 배열로 압축하여 메모리 위치를 최대화 할 수 있습니다. 문제 크기가 너무 작기 때문에 간단한 사용자 지정 도트 제품 및 순위 1 업데이트 루틴을 작성합니다. 컴파일러가 루틴을 인라인하여 호출 오버 헤드를 줄 이도록해야합니다. 고정 크기의 루프이기 때문에 컴파일러는 필요할 때 자동으로 인라인 및 언 롤링 할 수 있어야합니다.

가 식 안에 포함 한다는 사실을 이용하기 위해 트릭을 시도하지 않습니다 . 이러한 작은 문제 크기의 경우 이러한 트릭은 단순히 두 개의 개별 결정 행렬 계산을 수행하는 것보다 느려질 수 있습니다. 물론 이러한 주장을 확인하는 유일한 방법은 시도하는 것입니다.Q12IQJQ


1
Armadillo는 양의 한정 / 대각 적 우위를 이용하는 방법이없는 것처럼 보이기 때문에 루트가없는 Cholesky 인 를 구현할 것을 권장 합니다. LDLT
hardmath

5

이들의 구성에 대한 몇 가지 정보가 없으면 양의 확실한 실제 대칭 행렬, 할 수있는 제안은 매우 제한 필요성이다.12×12

Sourceforge에서 Armadillo 패키지를 다운로드하고 설명서를 살펴 보았습니다. 및 를 별도로 계산하여 성능을 향상 시키십시오 . 여기서 는 예를 들어 . 문서는 이것이 최대 크기 행렬에 대한 기본값 이므로 생략하면 옵션이 경우에 대한 기본값 이라고 가정합니다 .det ( 12 I Q J ) J 4 × 4 12 × 12det(Q)det(12IQJ)Jdet(Q,slow=false)4×4slow=true12×12

무엇 slow=true 아마도 수행하면 결정이 쉽게 발견되는 행에 쉴론 양식을 얻기에 부분 또는 전체 회전이다. 그러나 행렬 가 양의 명확한 값 임을 미리 알고 있으므로 안정성을 위해 피벗을 수행 할 필요가 없습니다 (적어도 대부분의 계산에서는 추정 할 수 있습니다. 피벗이 지나치게 작아지면 Armadillo 패키지에서 예외가 발생하는지 확실하지 않지만 합리적인 숫자 선형 대수 패키지의 특징 편집 : 나는 상당한 기능을 위해 C ++ 템플릿을 사용하여 헤더 파일에서 구현하는 Armadillo 코드를 발견했습니다 .이 설정 은 영향을 미치지 않습니다 .12 × 12Qdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×12계산은 피벗이 필요하지 않다는 표시없이 그 시점에서 계산이 "벽을 넘어서"LAPACK (또는 ATLAS)에 전달되기 때문에 결정됩니다. det_lapack해당 파일에서 호출을 참조하십시오 .

다른 요점은 BLAS 및 LAPACK의 고속 교체에 연결하는 Armadillo 패키지를 빌드하는 권장 사항을 따르는 것입니다. 섹 참조. 자세한 내용은 Armadillo README.TXT 파일의 5를 참조하십시오. [현재 64 비트 시스템의 속도에는 전용 64 비트 버전의 BLAS 또는 LAPACK을 사용하는 것이 좋습니다.]

에 켈론 형태로의 행 축소는 본질적으로 가우시안 제거이며, 산술 복잡도 있습니다. 두 행렬 모두이 작업의 두 배 또는 입니다. 이러한 작업은 처리 과정에서 "병목 현상"이 될 수 있지만 특별한 구조가 없으면 (또는 상환을 허용하는 1 조 개의 테스트 사례간에 알려진 관계가 있음) 작업이 로 줄어들 수 있다는 희망은 거의 없습니다 .(4)23n3+O(n2)QO(N2)43n3+O(n2)QO(n2)

비교를 위해, 일반 행렬의 보조 인자에 의한 확장 에는 포함됩니다곱셈 연산 (대략 많은 덧셈 / 빼기)이므로 경우 비교 ( vs. )는 보조 인자에 대한 제거를 분명히 선호합니다.n ! n = 12 12 ! = 479001600 2n×nn!n=1212!=47900160023n3=1152

작업이 필요한 또 다른 방법 은 가계 변환을 통해 를 3 각형 으로 줄이고 를 3 각형으로 만드는 것입니다. 그 후 컴퓨팅 및 는 연산 에서 수행 될 수 있습니다 . [ 두번째 결정에서 랭크 1 업데이트 의 효과는 하나의 삼각형 시스템을 해결함으로써 주어진 스칼라 인자로 표현 될 수있다.]Q12I-Q의DET(Q)DET(12I-Q-J)O(N)-J43n3+O(n2)Q12IQdet(Q)det(12IQJ)O(n)J

이러한 독립적 인 계산을 구현하는 것은 Armadillo의 det함수 를 성공적으로 (또는 실패한) 호출 한 결과를 확인하는 데 유용 할 수 있습니다 .

특수 사례 : Jernej의 의견에서 제안한 바와 같이 여기서 는 모든 것의 1 순위) 행렬이고 은 단수형 (양수) 대각선 행렬. 실제로 그래프 이론에서 제안 된 응용의 경우 정수 행렬이됩니다. 그런 다음 대한 명시 적 공식 은 다음과 같습니다.J D = diag ( d 1 , , d n ) det ( Q )Q=DJJD=diag(d1,,dn)det(Q)

det(Q)=(i=1ndi)(1i=1ndi1)

증명의 스케치는 더 넓은 적용 가능성을 설명 할 수있는 기회를 제공합니다. 즉, 에 알려진 결정 요인이 있고 시스템 가 빠르게 해결 될 때마다 . 다음을 고려하여 시작하십시오.D v = ( 1 1 ) TDDv=(11)T

det(DJ)=det(D)det(ID1J)

이제 는 다시 1 등급, 즉 입니다. 두 번째 결정 요인은 다음과 같습니다.( D - 1 (1) ... D - 1 N ) T ( 1 ... 1 )D1J(d11dn1)T(11)

f(1)=det(ID1J)

여기서 는 의 특성 다항식입니다 . 랭크 1 행렬로서, 는 nullspace를 설명하기 위해 적어도 인자를 가져야합니다. 계산에서 볼 수 있듯이 "missing"고유 값은 .D 1 J f ( x ) n 1 x d 1 if(x)D1Jf(x)n1xdi1

D1J(d11dn1)T=(di1)(d11dn1)T

특성 다항식 이며 은 , 입니다.f(1)det(I D 1 J)1 d 1 if(x)=xn1(xdi1)f(1)det(ID1J)1di1

또한 이면 이며, 결정 값은 단순히 대각선 항목의 대각선 행렬입니다.12 I Q J = 12 I D + J J =Q=DJ12IQJ=12ID+JJ=12ID


흠 .. 사실에 의 인접 행렬 인 I이 결과가 정확하지 않을 수 있다는 것을 생각할 수 있도록. 특히, 그래프 의 스패닝 트리의 수는 보유하지 않는 정도 순서에 의해 결정됨을 의미합니다. D - A A G GQDAAGG
Jernej

비 대각선 항목은 일반적으로 0과 -1을 포함합니다. 빅터 제안 분해 대칭 활용로부터 조작 횟수의 주요 용어를 감소 에 . 정확한 정수 접근 방식이 있지만 적당한 크기의 행렬과 항목에는 필요하지 않을 수 있습니다. 내가 구조를 이해한다면, 는 와 같은 이유로 확실하게 긍정적 입니다. L D L T 2QLDLT(1)23n312I13n3Q12IQJQ
hardmath

@Jernej : 내가 언급 한 것이 잘못되었다고 생각되면 이 질문을 기반으로 대화방을 만들었습니다 .
hardmath

1

결정자를 계산하려는 그래프를 열거하는 구조적 방법이 있다면, 한 그래프에서 다른 그래프로 이동하는 순위가 낮은 업데이트를 찾을 수 있습니다.

그렇다면 행렬 결정 행렬을 사용하여 현재 그래프 결정 요인에 대한 지식을 사용하여 다음 그래프의 결정 요인을 저렴하게 계산할 수 있습니다.

즉, 행렬 와 벡터 : U와 V가 다음과 같은 경우 일반화 할 수 있습니다. 행렬이고 는 : Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

역을 효율적으로 계산하려면 셔먼-모리슨 공식 을 사용하여 현재 행렬에서 후속 행렬의 역수를 구할 수 있습니다 .

(A+uvT)1=A1A1uvTA11+vTA1u

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