2014-06-10 72 views
0

這是來自Fortran 90代碼的一部分。從f90到where語句的轉換到matlab轉換

where (abs(A-B)>e) 
    no_converge=1 
elsewhere 
    no_converge=0 
end where 

A和B是一些特定維度的數組,e是標量。我必須說我對這兩種編程語言都不熟悉。

我已經使用了f2matlab,但它在Fortran語句上做的很差。

我想知道等價的Matlab的是否是這樣的:

if abs(A-B)>e 
    no_converge=1 ; 
else 
    no_converge=0 ; 
end 

這是正確的嗎?

no_converge是一個標量(Fortran聲明中的integer),用於不同部分以開始其他一些循環。

我真的很感謝這裏的任何建議,請讓我知道是否需要更多信息。

回答

1

不正確,沒有。在Fortran no_converge應該是與AB相同大小(和形狀)的數組;其元素將被設置爲1其中abs(A-B)>e0其他地方。所以在你的Matlab代碼no_converge不應該是一個標量,而是一個數組。但是,如果沒有看到你的聲明,我只是在進行有根據的猜測。向我們展示一些(更多)代碼。

我沒有Matlab的這臺計算機上,從而不能檢查,但如果我沒有記錯,你也可以做到這一點no_converge非常類似的東西,像這樣的

no_converge(abs(A-B)>e) = 1 
no_converge(abs(A-B)<=e) = 0 
提供

,在Fortran情況下,與AB具有相同大小和形狀的數組。

+0

由於它的工作原理是什麼你的建議我,確實no_converge必須是的與A和B尺寸相同 – user17880

0

Fortran中的WHERE statement排序結合了循環和條件,但僅適用於作業

在Fortran代碼no_convergence必須與(至少)相同的延伸AB的載體。所以,你提供的代碼肯定是不正確的。

我不知道你是否可以在Matlab中做類似的事情,但你總是可以做一個明確的循環,並按照元素方式進行收斂測試。

0

有WHERE構造中的Fortran可以通過MERGE一個班輪這f2matlab可能能夠更好地翻譯被替換:

no_converge = merge(1,0,abs(A-B)>e)