2016-05-20 3 views
-2

Я работаю над кодом fortran, чтобы преобразовать его в matlab. Я столкнулся с некоторыми проблемами с параметрами! Ниже приводится код, который дает мне ошибкуНужна помощь в размерности матрицы при преобразовании из 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 (я, р, п, м, ул MOT); эта часть, код работает совершенно.

Я знаю, что матрица double_sum имеет 6D, которая выглядит подозрительной для меня, но я хотел бы иметь вашу поддержку для успешного переноса этой части кода fortran.

Примечание: задан тот же вопрос на форуме matlab. Но stackoverflow имеет больше шансов, что люди будут работать на fortran 77. Поэтому просим его здесь.

+0

Как вы определили это в своем коде, 'double_sum' является только скаляром. Что вы пытаетесь выполнить при вызове 'double_sum (i, p, n, m, str, mot)'? – BillBokeey

+0

После первой инициализации double_sum = double_sum + mot (k, j, i, p) * str (k, j) также есть. Поэтому я могу сказать, что это 6D в fortran. То же самое я хочу «перевести» в matlab –

+0

На самом деле я слишком стараюсь понять код. Я получил этот код, и мне нужно перевести его с помощью Matlab. У меня очень слабое знание fortran. Следовательно, ваш ответ имеет большое значение. –

ответ

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? Массивы? Двусмысленный выбор скобок на этих двух языках вряд ли является ошибкой ОП, но необходимо обеспечить дополнительный ввод.

+0

Благодарим вас за ответ. Я попробовал предложенный код, но теперь он дает «Неопределенная функция или переменная double_sum». ошибка в строке double_sum = zeros (size (double_sum)). –

+0

Является ли double_sum функцией или массивом? Если double_sum является функцией, это означает, что вы отправили рекурсивную функцию, которая немного изменилась бы в совете, который вы получили. –

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).