2010-09-30 18 views
18

Tengo entendido que puede devolver una matriz desde una función en Fortran, pero por algún motivo mi código solo devuelve el primer valor en la matriz que le pido que regrese. Esta es la función:Función Devolver una matriz en Fortran

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 yo estoy llamando

C(1:numPoints) = polynomialMult(numPoints,x,f) 

print *, C(1:numPoints)` 

ahora no hace nada útil porque estoy tratando de entender la sintaxis antes de escribir la lógica . Vi algunas cosas sobre la especificación de tipos de funciones, pero cuando escribo

integer function polynomialMult(npts,x,y) 

o lo que sea me sale un error de compilación.

Respuesta

25

Para definir una función que devuelve una matriz incluyen la declaración de función dentro de la función, así:

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 

Su declaración

integer function polynomialMult(npts,x,y) 

declara que la función devuelve un entero. Un entero, no una matriz de enteros. No creo que el estándar permita declaraciones de funciones 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, su declaración:

polynomialMult = x(1:npts) + 1 

podía más concisa escribirse:

polynomialMult = x + 1 

desde Fortran asignará la suma escalar a todos los elementos de la matriz X que ha declarado tener sólo npts elementos.

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.

+1

Gracias por su ayuda. Como probablemente puedas decir, soy nuevo en Fortran. – Statler

3

Estoy de acuerdo con la respuesta anterior de que las siguientes obras:

polynomialMult = x + 1 

Sin embargo, sin saber que polynomialMult y x son matrices, se podría suponer que es una operación de escalar. Prefiero ser obvio y hacerlo de esta manera:

polynomialMult(:) = x(:) + 1 

Incluso he insistido en que los codificadores de mi grupo lo hacen de esta manera. No me gusta trabajar duro para entender el código de alguien; quiero que sea obvio lo que están haciendo.

+2

Haha, volví a esta pregunta cuando obtuvo otra votación.Hay un 'problema' sutil con esta respuesta: 'polynomialMult' es una matriz y' polynomialMult (:) 'es una sección de matriz y las dos no siempre son intercambiables, aunque están aquí. –

+0

@HighPerformanceMark: Diría algo como 'polynomialMult (1: npts) = x (1: npts) + 1'. Entonces no hay dudas, ¿verdad? – jvriesem

+1

@jvriesem, depende de cómo se establezcan los índices de 'polynomialMult'. Algunas veces hay buenas razones para usar índices no estándar como 'double precision polynomialMult (0: npts-1)'. En ese caso, corre el riesgo de errores con 'polynomialMult (0: npts-1) = x (0: npts-1) + 1', ya que accidentalmente puede escribir mal los índices en la expresión. – astay13

Cuestiones relacionadas