Конвертировать Фортран 77 в Фортран 95
У меня здесь есть кусок кода, и я не могу найти эффективный способ преобразования этого куска кода в эквивалент Fortran 95. Я уже пробовал несколько вещей, но я всегда застрял на создании 1D-массивов из матриц и наоборот (дело в том, чтобы сократить время вычислений, и если я их преобразовываю, я не могу придумать другого пути, чем использование циклов снова:/).
Это кусок кода:
do i=1,dim
do j=1,dim
Snorm(i,j)=Sval(j)/Sval(i)
Bnorm(i,j)=Bval(j)/Bval(i)
Pnorm(i,j)=Pval(j)/Pval(i)
enddo
enddo
Как бы вы написали это в коде Fortran95?
Эквивалент матрицы вычислений в R таков:
Snorm <- t(Sval %*% t(1/Sval))
Bnorm <- t(Bval %*% t(1/Bval))
Pnorm <- t(Pval %*% t(1/Pval))
Эквивалент этого в Python:
Snorm = (numpy.dot((Svalmat.T),(1/Svalmat))).T
Bnorm = (numpy.dot((Bvalmat.T),(1/Bvalmat))).T
Pnorm = (numpy.dot((Pvalmat.T),(1/Pvalmat))).T
with Svalmat etc the equivalent of Sval, but then columnmatrix
У кого-нибудь есть идея?
1 ответ
Это не стоит менять на мой взгляд. Это действительно Фортран 95. Особенно если вашей целью является расчет времени. Любые "умные" трюки с подмассивами могут вводить временные массивы.
Очевидная попытка forall
или же do concurrent
forall(i=1:dim, j=1:dim)
Snorm(i,j)=Sval(j)/Sval(i)
Bnorm(i,j)=Bval(j)/Bval(i)
Pnorm(i,j)=Pval(j)/Pval(i)
end forall
и то же самое с do concurrent
,
Обратите внимание, что ваш первоначальный порядок циклов, вероятно, не эффективен.