2012-07-02 3 views
1

Matlab에 약간의 문제가 있습니다. Matlab 정밀도와 관련이 있다고 생각하지만,이 문제를 해결하고 싶습니다. 세 개의 행렬이 있습니다. 하나는 mapping.mean (차원은 1x3118)이고 다른 하나는 mapping.M (차원은 3118x100)이라는 차원 296x3118이있는 f입니다.
다음 작업의 결과는 하나 여야하지만 그렇지 않습니다. 결과 행렬 f_s_1f_s_2은 10^-12의 범위에서만 다른 값을 갖습니다. 아무도 이유를 알 수 있습니까, 또는 어떻게 해결할 수 있습니까?동일한 행렬 연산이 Matlab에서 다른 결과를 반환합니다.

f_s_1 = ((f(1:296,:)-repmat(mapping.mean,296,1))*mapping.M)'; 
f_s_2 = ((f(1:295,:)-repmat(mapping.mean,295,1))*mapping.M)'; 
isequal(f_s_1(:,1:295),f_s_2) 

ans = 

0 

답변

3

은 당신이보고있는 것은 MATLAB에서 Round-off error의 결과이며, 가능성이 큰 행렬 연산의 병렬화에서 온다. 매우 큰 행렬 연산의 경우 MATLAB automatically switches to a parallel version of the operator to increase speed은 솔루션의 일부분을 모두 동시에 계산 한 다음 끝에 결합 할 수 있음을 의미합니다. 다른 부분은 조만간 끝나거나 원래 문제의 다른 부분으로 구성 될 수 있으므로 다른 결과를 얻을 수 있습니다.

귀하의 컴퓨터는 귀하의 컴퓨터에서 (귀하의 matlab 버전에서는 아마도 64 비트를 사용하는) 귀하의 전화 번호를 표현하기 위해 소수의 비트만을 사용하기 때문에 작업을 수행 할 때 잘리지 않는 작은 숫자가 있습니다. 실제로 매우 작은 숫자에 매우 큰 숫자를 추가하면 더 작은 숫자를 나타내는 "더 이상의 공간이 없기 때문에 컴퓨터는 매우 큰 숫자 만 결과로 반환 할 수 있습니다.

예를 들어, 다음 코드를 실행 해보십시오 :

mybase = 1e17; 

sum1 = mybase + sum(1e-4*ones(2^14,1)) - mybase 
sum2 = mybase - mybase + sum(1e-4*ones(2^14,1)) 

당신은 얻을해야합니다

합계가 단지 재 배열에도 불구하고
sum1 = 

    0 


sum2 = 

    1.6384 

, 서로 다른 번호를 초래한다. 이걸 가지고 놀면 MATLAB이 왼쪽에서 오른쪽으로 숫자를 더하고 숫자의 크기가 많이 다를 때 문제가 발생하기 시작합니다. 1.6384는 1e17의 아주 작은 부분이므로 우리는 전혀 실제 오류가 없다고 생각할 수 있습니다 ...하지만 합계가 잘못되어 있기 때문에 대답이 잘못되었습니다.

여기가 왜 관련이 있습니까? 이전에 언급했듯이 MATLAB이 연산을 병렬 처리하도록 선택한 경우 문제의 각 부분이 동시에 계산되어 결합됩니다. 조각은 여러 가지 (문제 크기, 컴퓨터가 수행하는 다른 작업 등)에 따라 다른 순서로 추가 될 수 있습니다. 이는 결과가 약간 다를 것임을 의미합니다. 내 버전 (R2012a)에서 동일한 크기로 행렬을 설정하면 동일한 대답을 얻거나 그렇지 않을 수도 있습니다. 또한 크기에 따라 다릅니다.

이 동작은 "기능"이며, 답장을 보내 maxNumCompThreads(1)

+0

감사를 사용할 때 나는 심지어 같은 대답을 얻었다. – SwatchPuppy