2017-05-04 111 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

或者您可以更改聲明和分配方式,交換軸。 –