2013-01-21 121 views
1

我有一個比特的代碼看起來是這樣的循環:上扁平FORTRAN矩陣

DO I=0,500 
    arg1((I*54+1):(I*54+54)) = premultz*sinphi(I+1) 
ENDDO 

總之,我有尺寸54的陣列premultz我有尺寸501的陣列sinphi欲將sinphi的第一個值乘以premultz的所有條目並將其存儲在arg1的前54個條目中,然後將sinphi的第二個值乘以premultz的所有條目並將其存儲在arg1的第54個條目中,以此類推。

這些是扁平的矩陣。作爲這個項目的主要目標之一是速度非常快,我已經將它們放在了速度上。

我的問題是:是否有一種更有效的方法來編碼Fortran90中的這種計算?我知道Fortran有許多可以完成的漂亮的數組操作,但我並沒有完全意識到這一點。

在此先感謝。

回答

0

這個表達式,如果我有正確的事情,應該在一個聲明中

arg1 = reshape(spread(premultz,dim=2,ncopies=501)*& 
       &spread(sinphi,dim=1,ncopies=54),[1,54*501]) 

我在這裏硬的尺寸,可能會或可能不適合你的目的創建arg1。內部表達式生成premultzsinphi的外積,然後將其重新整形爲一個向量。你可能會發現你需要重塑外部產品的轉置,我沒有仔細檢查過的東西。然而,基於我對這種巧妙使用Fortran數組內在函數的經驗,我懷疑Fortran數組內在函數的這種或大多數其他聰明用法將超越您已有的簡單循環實現。對於這些操作中的許多操作,編譯器將生成數組的副本,並且複製數據相對昂貴。當然,這是你可能想要測試的主張。

我會讓你決定是否單行比循環更容易理解。有時候,數組語法的表達性在性能上可以接受,但有時不會。

+0

謝謝!我會給你一個鏡頭。 – user1997417