• Lunes 29 de Abril de 2024, 16:19

Autor Tema:  De c a matlab problema con complejos  (Leído 1885 veces)

portirijillo

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
De c a matlab problema con complejos
« en: Domingo 11 de Marzo de 2012, 19:29 »
0
Hola a todos, espero que este en la seccion correcta con esta pregunta.
Pasa que llevo varios dias haciendo programas en c, posteriormente compilados con matlab usando el mexfuction, para que sean usados dentro de él.
Y ahora me surge un problema. El programa resuelve raices de polinomios, y para introducir el polinomio y que arroje el resultado se usa la sintaxis " x = polinomio([1,0,-1]) " que equivale a introducir x²-1, ya el programa arroja las raices en la variable x sean reales o complejas.

El problema ahora es que necesito introducir numeros complejos, ya sea reales puros, imaginarios puros o ambos. Aqui es donde tengo problema, ya que matlab no me da problemas si el vector es solo imaginario o complejo (mixto real e imaginario) el problema viene cuando es real puro. Dejo mi codigo.

Código: [Seleccionar]
  #include "mex.h"
     
     void oper(double *vro, double *vio, double *vii, double *vri){
               vro [0] = vri[0];
               vio [0] = vii [0]; //Aqui solo reflejaremos lo que se introdujo real e imaginario
}

void mexFunction (int nlhs, mxArray* plhs[], int nrhs,
                  const mxArray* prhs[])
     {
       mwIndex i;
       mwSize n;
       double *vri, *vro;
   double *vii, *vio;
       if (nrhs != 1 || ! mxIsNumeric (prhs[0]))
         mexErrMsgTxt ("expects matrix");
     
       n = mxGetNumberOfElements (prhs[0]);
       plhs[0] = (mxArray *) mxCreateNumericArray
         (mxGetNumberOfDimensions (prhs[0]),
          mxGetDimensions (prhs[0]), mxGetClassID (prhs[0]),
          mxIsComplex (prhs[0]));       
vii = mxGetPi (prhs[0]); //Parte imaginaria del vector de entrada
vri = mxGetPr (prhs[0]); //PArte real del vector de entrada
vro = mxGetPr (plhs[0]); //Parte real de la salida
        vio = mxGetPi (plhs[0]);//Parte imaginaria de la salida
        oper(vro,vio,vii,vri);
     }

Para usarlo en matlab
mex nombrearchivo.c
x = nombrearchivo([5+2i])
y = nombrearchivo([2i])
z = nombrearchivo([5]) //Aqui es donde se friega la cosa, ya no sirve en este caso.
Espero haberme explicado, y saludos.

caperutxa

  • Miembro activo
  • **
  • Mensajes: 40
  • Nacionalidad: 00
    • Ver Perfil
Re:De c a matlab problema con complejos
« Respuesta #1 en: Lunes 12 de Marzo de 2012, 07:39 »
0
Prueba a poner un 5+0i como imaginario.

Si acaso dile que te muestre por pantalla los valores que utiliza. Esto es si utiliza vio pero no lo has especificado, puede que trate con un null, o basura.
Si quieres obtener resultados diferentes no hagas siempre lo mismo.