F2PY. Проходящий массив. не удалось преобразовать второй аргумент xmin файла mga.init в массив C/Fortran

Я использую F2PY в первый раз. У меня есть процедура FORTRAN, похожая на:

    SUBROUTINE init(ranMatr,low,upp,nbvar,size)

    IMPLICIT NONE
    INCLUDE 'parameter.h'

    DOUBLE PRECISION ranMatr(dimpop,dim), low(dim), upp(dim),sigma
    INTEGER k, j, nbvar,size

CF2PY   intent(in) low, upp, nbvar, size
CF2PY   intent(in,out) ranMatr

    DO k = 1, size
    DO j = 1, nbvar
        CALL uniforme(1,sigma)
        ranMatr(k,j) = low(j) + sigma * (upp(j) - low(j))        
    ENDDO
    ENDDO
    RETURN
    END

Он в основном инициализирует случайную матрицу под названием «ranMatr» со значениями в диапазоне, определяемом low и upp. Uniforme — это подпрограмма, возвращающая значение из равномерного распределения.

Теперь я установил numpy и f2py и попытался протестировать его с помощью этого кода.

Я создаю входные данные Python следующим образом:

ranMatr = [[0 for col in range(0, 5)] for row in range(0,10)]
low = numpy.array([1,2,3,4,5])
upp = numpy.array([6,7,8,9,10])

а затем попытался запустить процедуру:

init(ranMatr, low, upp, 5, 20)

Но я всегда получаю это сообщение об ошибке:

0-th dimension must be fixed to 100 but got 5
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
mga.error: failed in converting 2nd argument `low' of mga.init to C/Fortran array

Я предполагаю, что проблема связана с размерами, но я понимаю, что dim должно быть верхней границей для «низких» векторных размеров.

Что я делаю неправильно?


person user3824727    schedule 10.07.2014    source источник
comment
dim==100?, не вижу определения в выложенном коде.   -  person Peter    schedule 10.07.2014
comment
это потому, что dim определен в файле parameter.h, который включен в начало кода фортрана.   -  person user3824727    schedule 10.07.2014


Ответы (1)


Вы должны передать массив low с размером dim, как указано в сообщении об ошибке. Некоторую информацию можно найти здесь, пункт "2". Или вы всегда можете использовать size вместо dim:

SUBROUTINE init(ranMatr,low,upp,nbvar,size)
...
INTEGER k, j, nbvar,size
DOUBLE PRECISION ranMatr(dimpop,size), low(size), upp(size),sigma
...
person Peter    schedule 10.07.2014