从f90到matlab转换的where语句

时间:2014-06-10 19:15:51

标签: matlab fortran conventions

这是Fortran 90代码的一部分。

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),在不同的部分使用,以便开始其他一些循环。

我将非常感谢您的任何建议,请告诉我是否需要更多信息。

3 个答案:

答案 0 :(得分:1)

不正确,不。在Fortran中no_converge应该是与AB相同大小(和形状)的数组;其元素将设置为1,其中abs(A-B)>e0位于其他地方。因此,在您的Matlab代码no_converge中,不应该是标量而是数组。但是,如果没有你的声明,我只是在做出有根据的猜测。向我们展示一些(更多)代码。

我没有在这台计算机上使用Matlab,所以无法检查,但如果内存对我很好,你可以做一些非常相似的事情,比如这个

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

前提是no_converge与Fortran案例一样,是一个与AB大小和形状相同的数组。

答案 1 :(得分:0)

Fortran中的WHERE statement将循环与条件组合在一起,但仅适用于赋值

Fortran代码中的

no_convergence必须是一个向量(至少)与AB相同的向量。所以,您提供的代码肯定是错误的。

我不知道你是否可以在Matlab中做类似的事情,但是你总是可以做一个明确的循环并测试收敛元素。

答案 2 :(得分:0)

Fortran中的WHERE构造可以用MERGE单行替换,f2matlab可以更好地翻译:

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