我一直在研究一个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上工作的机会。因此在这里问。
答案 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源来检查上下文...(包括在此代码之外如何使用i
和d(:)
)。然而,如果我们使用上面的解释,相应的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的错误,但是有必要提供进一步的输入。