이 두 코드 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 지금은 분명하다?
어떤 차이가 있습니까? 차이를 설명해야합니다. 코드를 실행하더라도 사용자가 보는 것과 다른 것을 볼 수 있습니다. 결과를 표시하고 의견을 말하십시오. [ask]와 [mcve]를 읽으십시오. –
초기화 된 배열의 숫자는 배정도가 아닌 단 정밀도입니다 (중복이 많음). 그러나 실제로, 당신은 우리에게 당신이 말하는 차이를 보여 주어야합니다. –
다음 중 하나가 중복 될 수 있습니다. 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] –