我在这里得到了一段代码,我似乎无法找到将这段代码转换为Fortran 95等效代码的有效方法。我已经尝试了好几件事,但我总是坚持用矩阵制作一维数组,反之亦然(重点是减少计算时间,如果我转换它们,我想不出另一种方法,而不是使用循环再次:/)。
这是一段代码:
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
有人有想法吗?
答案 0 :(得分:5)
我认为不值得改变。它是有效的Fortran 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
相同。
请注意,循环的原始顺序可能效率不高。