Está en la página 1de 3

EXAMEN COMPUTACiN CIENTFICA, 6/4/2017

NOTA: A pesar de haber resuelto los tres ejercicios, el primero y el tercero son aqullos de
los que estoy ms seguro, por lo que agradecera que fueran los que se tuvieran en cuenta.

Pregunta 1) La siguiente funcin Matlab calcula las distancias desde el origen de


coordenadas a un conjunto de puntos en el espacio, cuyas coordenadas vienen guardadas en
los vectores x, y, z. Por supuesto, los vectores x, y ,z deben tener el mismo nmero de
componentes. Adems, no nos interesan las distancias mayores que uno, as que si hay una
distancia mayor que uno se le da el valor 100:
function [ distancias ] = mif_long(x,y,z )
n=length(x);
for i=1:n
distancias(i)=sqrt(x(i)^2+y(i)^2+z(i)^2);
if distancias(i)>1
distancias(i)=100;
end
end

Modifica esta funcin para que sea lo ms eficiente posible. Hay varias optimizaciones
posibles, se puntuar positivamente cualquier optimizacin razonable.

RESUPUESTA:
function [ distancias ] = mif_long(x,y,z )

distancias=sqrt(x.^2+y.^2+z.^2);
distancias(distancias>1)=100;

end

Pregunta 2) Queremos crear un Gateway para una funcin en C fun_exam_c ( no nos


importa lo que hace fun_exam_c) . La funcin Matlab deseada (fun), toma como argumento de
entrada una matriz A de dimensin M filas por N columnas, y un vector b de N filas por 1.
La funcin fun devuelve como resultado una matriz X de con N+1 filas y M columnas, y un
vector z con una fila y M columnas. A la funcin fun_exam_c se la llamara as: fun_exam_c
(A,b,X,z), y la llamada desde Matlab sera:

>>[X,z]=fun(A,b)

A continuacin tienes un Gateway escrito para esta subrutina, pero que contiene algunos
errores (5, al menos) Indica donde estn los errores y arrglalos.
void mexFunction( int nlhs, mxArray *plhs[],

int nrhs, const mxArray *prhs[] )

double *A, *b,*X, *z;

size_t mrows1,ncols1,mrows2,ncols2,uno ,tam ;

uno=1;

if(nrhs!=2) {

mexErrMsgIdAndTxt( "MATLAB:fun:invalidNumInputs", "2 inputs required.");

} else if(nlhs!=2) {

mexErrMsgIdAndTxt( "MATLAB:fun: invalidNumOutputs ", "2 outputs required");

mrows1 = mxGetM(prhs[0]);

ncols1 = mxGetN(prhs[0]);

mrows2 = mxGetM(prhs[1]);

ncols2 = mxGetN(prhs[1]);

if (ncols1 != mrows2) {

mexErrMsgIdAndTxt( "MATLAB:fun: error dimensiones en arg. De entrada ", "");

tam=ncols1+1; El argumento debera ser: ((mwSize)tam,(mwSize)mrows1)


plhs[0] = mxCreateDoubleMatrix((mwSize)mrows1, (mwSize)tam, mxREAL);

plhs[1] = mxCreateDoubleMatrix((mwSize)uno, (mwSize)ncols1, mxREAL);


El argumento debera ser: ((mwSize)uno,(mwSize)mrows1)

/* Assign pointers to each input and output. */

A = mxGetPr(prhs[0]);

b = mxGetPr(plhs[0]); El argumento debera ser: (prhs[1]) (2 fallos)

X = mxGetPr(prhs[1]); El argumento debera ser: (plhs[0])


z = mxGetPr(plhs[1]);

/* Call the yyy subroutine. */

fun_exam_c (A,b,X,z);

}
Pregunta 3)
3) El siguiente trozo de cdigo fortran toma una matriz A de dimensiones N por M, y sustituye
los elementos de las filas pares por los senos de esos elementos, y sustituye los elementos de
las filas impares por cosenos de esos elementos.

DO i=1,N

IF (mod(i,2)==0)

DO j=1,M

A(i,j)=sin(A(i,j))

END DO

ELSE

DO j=1,M

A(i,j)=cos(A(i,j))

END DO

END IF

END DO

Escribe un cdigo equivalente con solo dos lneas usando instrucciones matriciales de Fortran
90.

RESPUESTA:

A(2:N:2,:)=sin(A(2:N:2,:))

A(1:M:2,:)=sin(A(1:M:2,:))