arrays - guia - multiplicacion de matrices en fortran 90
FunciĆ³n Devolver una matriz en Fortran (2)
Tengo entendido que puede devolver una matriz desde una función en Fortran, pero por alguna razón mi código solo devuelve el primer valor en la matriz que le pido que regrese. Esta es la función:
function polynomialMult(npts,x,y)
integer npts
double precision x(npts), results(npts + 1), y(npts,npts)
polynomialMult = x(1:npts) + 1
end function
y aquí es donde lo estoy llamando
C(1:numPoints) = polynomialMult(numPoints,x,f)
print *, C(1:numPoints)`
en este momento no hace nada útil porque intento comprender la sintaxis antes de escribir la lógica. Vi algunas cosas sobre especificar tipos para funciones, pero cuando escribo
integer function polynomialMult(npts,x,y)
o lo que sea que obtenga un error de compilación.
Para definir una función que devuelve una matriz, incluya la declaración de función dentro de la función, como esta:
function polynomialMult(npts,x,y)
integer npts
double precision x(npts), results(npts + 1), y(npts,npts)
! Change the next line to whatever you want
double precision, dimension(npts) :: polynomialMult
polynomialMult = x(1:npts) + 1
end function
Tu declaración
integer function polynomialMult(npts,x,y)
declara que la función devuelve un número entero. Un entero , no una matriz de enteros. No creo que el estándar permita declaraciones de funciones tales como:
integer, dimension(10) function polynomialMult(npts,x,y)
Pero podría estar equivocado. Siempre uso el formulario que te mostré arriba.
Si tiene un compilador Fortran actualizado, puede hacer cosas inteligentes como devolver una matriz asignada. Y sugiero que descubras la sintaxis de la matriz. Por ejemplo, tu declaración:
polynomialMult = x(1:npts) + 1
podría escribirse más concisamente:
polynomialMult = x + 1
ya que Fortran npts
la adición escalar a todos los elementos de la matriz x que usted ha declarado que tiene solo elementos npts
.
Pasar los tamaños de matrices a subrutinas es muy FORTRAN77 y casi siempre innecesario ahora. En general, o bien desea operar en cada elemento de una matriz (como en el ejemplo de sintaxis de matriz) o debe dejar que el subprograma determine el tamaño de la matriz con la que está tratando.
Estoy de acuerdo con el contestador anterior en que lo siguiente funciona:
polynomialMult = x + 1
Sin embargo, sin saber que polynomialMult y x son matrices, uno podría suponer que es una operación escalar. Prefiero ser obvio y hacerlo de esta manera:
polynomialMult(:) = x(:) + 1
Incluso he insistido en que los codificadores de mi grupo lo hagan de esta manera. No me gusta trabajar duro para entender el código de alguien; quiero que sea obvio lo que están haciendo.