2017-05-04 60 views
0

我在Python代码,我需要“翻译”来的Fortran(我不知道多少....)等效numpy.dot(蟒蛇)的

我:

>>>Mat1 
array([[ 0.2], 
     [ 0.4], 
     [-0.2], 
     [-0.8]]) 
>>> X 
array([[0, 0, 1, 1], 
     [0, 1, 1, 0], 
     [1, 0, 1, 0], 
     [1, 1, 1, 1]]) 

然后我做的:

Result=np.dot(X,Mat1) 

我愿做等值的Fortran

REAL(8), DIMENSION(4,1)::Mat1 
REAL(8), DIMENSION(4,4)::X 

X(:, 1)=(/0, 0, 1, 1/) 
X(:, 2)=(/0, 1, 1, 0/) 
X(:, 3)=(/1, 0, 1, 0/) 
X(:, 4)=(/1, 1, 1, 1/) 

Mat1(:,1)=(/0.2,0.4,-0.2,-0.8/) 

但是在这种情况下,numpy.dot并不是真的在做一个点积......我不知道应该使用DOT_PRODUCT还是MATMUL。事情对我来说真的不清楚。

+1

真实(8)真的很丑并且不便携。 –

+0

我在fortran中用得不多,最好的方法是什么?为什么?谢谢 ! – Dadep

+0

请参阅http://stackoverflow.com/documentation/fortran/939/data-types/4390/precision-of-floating-point-numbers#t=201705051137167832126我将以'rp = kind(1.d0)'开头。 –

回答

1

为此,MATMUL就是您想要的方式。见here。 DOT_PRODUCT仅适用于矢量。 MATMUL可以处理尺寸允许矩阵乘法的任何矩阵。

在您的示例中,您的矩阵没有匹配的维度。数学(不只是FORTRAN)期望m*k矩阵乘以k*n矩阵。您需要交换Mat1的轴。

编辑:或者,作为francescalus笔记,您可以通过声明DIMENSION(4)使其成为排名第一的向量。

+0

我已经尝试过了,但是我得到了'参数的形状不一致或不一致'.... – Dadep

+1

是的,你不能乘以4x4的4x4。这是数学规则,而不仅仅是FORTRAN。您需要将4x1转置为1x4。 –

+0

或者您可以更改声明和分配方式,交换轴。 –