在从fortran转换为matlab时需要矩阵维度方面的帮助

时间:2016-05-20 11:09:59

标签: matlab fortran fortran77

我一直在研究一个fortran代码,将其转换为matlab。我正面临一些尺寸问题!以下是给我错误的代码

   do 10 p = 1,m

    d(p) = 0.d0
    d(p) = x - x1(i,p) - x2(i,p) -
 &      double_sum(i,p,n,m,str,mot)

10      continue

double_sum = 0.d0

    do 10 j = 1,m
      do 20 k = 1,n
        if (k .eq. i) then
        else
          double_sum = double_sum + mot(k,j,i,p)*str(k,j)
        endif

20      continue
10    continue

我将其转换为matlab:

for p=1:m
                d(p)=0;
                double_sum = 0;
                for j=1:m
                    for k=1:n
                        if k==i
                        else
                          double_sum = double_sum + mot(k,j,i,p)*str(k,j);
                        end
                    end
                end
                d(p)=x - x1(i,p) - x2(i,p)-double_sum(i,p,n,m,str,mot);
            end

我收到“索引超出矩阵”的错误。

错误行是我代码的这一部分:

d(p)=x - x1(i,p) - x2(i,p)-double_sum(i,p,n,m,str,mot);

因此,如果我忽略 double_sum(i,p,n,m,str,mot); 此部分,代码运行完美。

我知道double_sum矩阵是6D,看起来很可疑,但我希望得到你的支持,成功移植这段fortran代码。

注意:在matlab论坛上问同样的问题。但是stackoverflow有更多人在fortran 77上工作的机会。因此在这里问。

2 个答案:

答案 0 :(得分:1)

如果问题中的Fortran代码确实是一切,那么它可能是一个非常粗略的代码片段,解释了如何计算数组d(:)

do 10 p = 1, m
    d( p ) = x - x1( i, p ) - x2( i, p ) - double_sum( i, p, n, m, str, mot )
10 continue

定义的函数double_sum()
double precision function double_sum( i, p, n, m, str, mot )
implicit none
integer,          intent(in) :: i, p, n, m
double precision, intent(in) :: str( n, m ), mot( n, m, ?, ? )
integer j, k

    double_sum = 0.d0

    do 10 j = 1, m
    do 20 k = 1, n
        if (k .eq. i) then
        else
            double_sum = double_sum + mot( k, j, i, p ) * str( k, j )
        endif
20  continue
10  continue
end

虽然最好找到原始的Fortran源来检查上下文...(包括在此代码之外如何使用id(:))。然而,如果我们使用上面的解释,相应的Matlab代码可能如下所示:

for p = 1:m

    double_sum = 0;
    for j = 1:m
    for k = 1:n
        if k == i
        else
            double_sum = double_sum + mot( k, j, i, p ) * str( k, j );
        end
    end
    end

    d( p ) = x - x1( i, p ) - x2( i, p ) - double_sum;    % <--- no indices for double_sum
end

double_sum()也有可能是一个递归函数,但由于我们不能使用函数名作为结果变量(例如this page),所以可以排除这种可能性(所以Fortran代码有两个范围,如冗余标签10所示。

答案 1 :(得分:0)

循环中有错误。 fortran代码在p = 1:m上运行一个循环,其结尾由continue语句标记。然后,j和k上的两个嵌套循环跟随。

假设您事先知道所有数组的大小并将它们初始化为正确的大小(根据您的错误陈述可能不是这种情况)这更像是您发布的fortran示例。

 d = zeros(size(d));
 for p=1:m
     d(p)=x - x1(i,p) - x2(i,p)-double_sum(i,p,n,m,str,mot);
 end

% add a statement here  to set all entries of double sum to zero
double_sum = zeros(size(double_sum))

for j=1:m
    for k=1:n
        if k==i
        else
            double_sum = double_sum + mot(k,j,i,p)*str(k,j);
        end
    end
end

在不了解代码的更多部分的情况下提供建议有点困难。是mot和str和double_sum函数?阵列?这两种语言中括号的模糊选择几乎不是OP的错误,但是有必要提供进一步的输入。