2017-11-18 1 views
0

이 두 코드 1은 C++로, 두 번째 코드는 포트란에서 다른 점을 설명하지 않습니다 ... 차이점을 얻지 못했습니다 ...포트란 코드 및 C++ 코드와 다른 결과

C++ :

# include <iosfwd> 
# include <vector> 
# include <cmath> 
# include <iomanip> 
# include <iostream> 

std::vector<double> dot(int size, std::vector<double> x, 
         std::vector<double> aa, std::vector<int> ja) 
{  

     std::vector<double> y(x.size()); 

     for(auto i = 0; i < size ; i++) 
      y.at(i) = aa.at(i) * x.at(i); 

     for(auto i=0 ; i < size ; i++) 
     { 
     //for(auto k=ja.at(i) ; k< ja.at(i+1)-1 ; k++) 
     auto k = ja.at(i); 

     do 
     { 
      y.at(i) += y.at(i) + aa.at(k) * x.at(ja.at(k)) ; 
      k++; 
     } 
     while(k < ja.at(i+1)-1) ; 

     } 

} 


int main() 
{ 
    std::vector<double> x = {0.,1.3,4.2,0.8} ; 

    std::vector<double> aa = {1.01,4.07,6.08,9.9,0.,2.34,3.12,1.06,2.2}; 
    std::vector<int> ja = {6,7,7,8,10,3,1,1,3}; 

    std::vector<double> y = dot(x.size(), x , aa , ja); 

    for(auto& i : x) 
     std::cout << i << ' ' ; 
    std::cout << std::endl; 
} 

포트란 코드, 나는 C 1 에서 0 포트란에서 인덱스를 시작 ++ 것을 알고 있지만 나는이 생각했습니다 생각! 그건 그렇고 오른쪽 하나는 다음과 같이 포트란 코드입니다.

MODULE MSR 
IMPLICIT NONE 

CONTAINS 
    subroutine amuxms (n, x, y, a,ja) 
     real*8 x(*), y(*), a(*) 
     integer n, ja(*) 
     integer i, k 
     do 10 i=1, n 
     y(i) = a(i)*x(i) 
10  continue 
     do 100 i = 1,n 

     do 99 k=ja(i), ja(i+1)-1 
      y(i) = y(i) + a(k) *x(ja(k)) 
99  continue 
100 continue 

     return 

     end 

END MODULE 

PROGRAM MSRtest 
USE MSR 
IMPLICIT NONE 
INTEGER :: i 
REAL(KIND(0.D0)), DIMENSION(4) :: y, x= (/0.,1.3,4.2,0.8/) 

REAL(KIND(0.D0)), DIMENSION(9) :: AA = (/ 1.01, 4.07, 6.08, 9.9, 0., 2.34, 3.12, 1.06, 2.2/) 
INTEGER , DIMENSION(9)   :: JA = (/6, 7, 7, 8, 10, 3, 1, 1, 3/) 
CALL amuxms(4,x,y,aa,ja) 

WRITE(6,FMT='(4F8.3)') (y(I), I=1,4)  

END PROGRAM 

나는 실수를 저질렀습니다. ja_을 색인으로 사용 .. 나는 subtrac 1을 잊어 버렸다!

정도로 작업 함수이다 :

# include <iosfwd> 
# include <vector> 
# include <cmath> 
# include <iomanip> 
# include <iostream> 

std::vector<double> dot(int size, std::vector<double> x, 
         std::vector<double> aa, std::vector<int> ja) 
{  

     std::vector<double> y(x.size()); 

     for(auto i = 0; i < size ; i++) 
      y.at(i) = aa.at(i) * x.at(i); 

     for(auto i=0 ; i < size ; i++) 
     { 

     auto k = ja.at(i)-1; 

     do 
     { 
      y.at(i) += aa.at(k) * x.at(ja.at(k)-1) ; 
      k++; 
     } 
     while(k < ja.at(i+1)-1) ; 

     } 
     return y; 
} 
두 코드의 차이를 고려하지 않고 다른 벡터 인덱스로 ja_(index) 사용 내부

포트란 코드 ja_(1) 우리에게 ja_의 제 1 값을 제공한다는 C++에서 두 번째! @ 블라디미르 F 지금은 분명하다?

+0

어떤 차이가 있습니까? 차이를 설명해야합니다. 코드를 실행하더라도 사용자가 보는 것과 다른 것을 볼 수 있습니다. 결과를 표시하고 의견을 말하십시오. [ask]와 [mcve]를 읽으십시오. –

+2

초기화 된 배열의 숫자는 배정도가 아닌 단 정밀도입니다 (중복이 많음). 그러나 실제로, 당신은 우리에게 당신이 말하는 차이를 보여 주어야합니다. –

+0

다음 중 하나가 중복 될 수 있습니다. https://stackoverflow.com/questions/6146005/is-there-a-better-double-precision-assignment-in-fortran-90 https://groups.google.com/을 참조하십시오. forum/#! topic/comp.lang.fortran/IoI5Mes2Se4 [151-175] –

답변

1

내가 보는 C++ 코드에는 몇 가지 문제가 있습니다.

먼저 dot 함수는 아무 것도 반환하지 않습니다. 끝에 return y; 문이 필요합니다.

다른 함수는 해당 함수의 가장 안쪽 루프에 y.at(i)입니다. y.at(i) = y.at(i) + aa... 또는 y.at(i) += aa... 중 하나 여야하며 두 가지가 모두 있어야합니다.

세 번째 문제는 출력 루프에서 잘못된 배열 (y 대신 x)을 사용하고 있다는 것입니다.

다른 문제가있을 수 있습니다. 디버거에서 프로그램을 실행하고 실행 결과를 비교하면 문제를 발견하는 데 도움이 될 수 있습니다.

+0

덕분에 인덱스로 사용하는 모든 ja_ (i)와 ja (k)에서 1을 빼서 해결했습니다! –

관련 문제