MATLAB을 사용하여 모든 시간 단계에서 를 풀어야하는 문제를 해결하고 있습니다 . 여기서 b 는 시간에 따라 바뀝니다. 지금은 MATLAB을 사용 하여이 작업을 수행하고 있습니다 .mldivide
x = A\b
필요한만큼 사전 계산을 수행 할 수있는 유연성이 있으므로보다 빠르고 정확한 방법이 있는지 궁금합니다 mldivide
. 여기서 일반적으로 수행되는 작업은 무엇입니까? 모두 감사합니다!
MATLAB을 사용하여 모든 시간 단계에서 를 풀어야하는 문제를 해결하고 있습니다 . 여기서 b 는 시간에 따라 바뀝니다. 지금은 MATLAB을 사용 하여이 작업을 수행하고 있습니다 .mldivide
x = A\b
필요한만큼 사전 계산을 수행 할 수있는 유연성이 있으므로보다 빠르고 정확한 방법이 있는지 궁금합니다 mldivide
. 여기서 일반적으로 수행되는 작업은 무엇입니까? 모두 감사합니다!
답변:
당신이 할 수있는 가장 명백한 일은 사전 계산하는 것입니다
[L,U] = lu(A)
~ O (n ^ 3)
그럼 당신은 단지 계산
x = U \ (L \ b)
~ O (2 n ^ 2)
이것은 비용을 엄청나게 줄이고 더 빠르게 만듭니다. 정확도는 같습니다.
L\b
. 전문가라고 생각하는 사람들 이이 정확한 라인이 고성능 코드에서 사용되는 것을 보았 기 때문에.
V = inv(A);
...
x = V*b;
inv(A)
V*b
>> n = 5000;
>> A = randn(n,n);
>> x = randn(n,1);
>> b = A*x;
>> rcond(A)
ans =
1.3837e-06
>> tic, xm = A\b; toc
Elapsed time is 1.907102 seconds.
>> tic, [L,U] = lu(A); toc
Elapsed time is 1.818247 seconds.
>> tic, xl = U\(L\b); toc
Elapsed time is 0.399051 seconds.
>> tic, [L,U,p] = lu(A,'vector'); toc
Elapsed time is 1.581756 seconds.
>> tic, xp = U\(L\b(p)); toc
Elapsed time is 0.060203 seconds.
>> tic, V=inv(A); toc
Elapsed time is 7.614582 seconds.
>> tic, xv = V*b; toc
Elapsed time is 0.011499 seconds.
>> [norm(xm-x), norm(xp-x), norm(xl-x), norm(xv-x)] ./ norm(x)
ans =
1.0e-11 *
0.1912 0.1912 0.1912 0.6183
안정성 및 오류 분석에 대해서는이 다른 답변에 대한 의견 , 특히 VictorLiu 의 의견을 참조하십시오 .
타이밍은 상당히 일정한 UNIX로드 평균 5를 갖는 12 코어 컴퓨터에서 Matlab R2011b로 수행되었습니다. tic, toc
3 개의 프로브 중 최상의 시간.
백 슬래시를 사용하는 것은와 거의 inv(A)*B
비슷합니다. 자유롭게 코딩한다면 후자가 더 직관적 일 수 있습니다. 설명은 Matlab 설명서를 확인해야하지만 거의 동일합니다 (계산 수행 방식이 다릅니다).
귀하의 질문에 대답하기 위해 백 슬래시는 일반적으로 괜찮지 만 질량 행렬의 속성에 따라 다릅니다.
inv(A)
혼자서보다 비싸기 때문에 왜 계산 A\b
하겠습니까?