#c #matlab #mex
#c #matlab #mex
Вопрос:
У меня возникли проблемы с умножением двух матриц с использованием mex-файлов в Matlab с помощью C. Я компилирую следующий код, но когда я вызываю функцию, Matlab отключается:
#include "mex.h"
void Multipl(double **a, double **b, double **res, mwSize n)
{
mwSize i;
mwSize j;
mwSize k;
for (i=0; i<n; i ) {
for (j=0; j<n; j ){
res[i][j]=0;
for(k=0;k<n;k ){
res[i][j] =a[i][k]*b[k][j];;
}
}
}
}
void mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
size_t ncols; /* size of matrix */
mxArray *mx, *my;
double *pr, *qr;
int *sr;
mx = mxCreateDoubleMatrix(2,3,mxREAL);
pr = mxGetPr(mx); // pointer to first double element of mx
qr = (double *)mxGetData(mx); // pointer to first double element of mx
my = mxCreateNumericMatrix(2,3,mxINT32_CLASS,mxREAL);
sr = (int *)mxGetData(my); // pointer to first int element of my
ncols = mxGetN(prhs[1]);
plhs[0] = mxCreateDoubleMatrix(1,(mwSize)ncols,mxREAL);
int* outMatrix = (int *)mxGetData(plhs[0]);
/* call the computational routine */
Multipl(mx,my,outMatrix,(mwSize)ncols);
}
Что я должен изменить в этом коде??
Любая помощь приветствуется.
Комментарии:
1. Разве mx и мои обе матрицы не 2×3? И выходной буфер равен 1x??
2. Так много проблем с вашим кодом … приведение int * к double **, приведение mxArray * к double **, использование неинициализированной памяти, использование матрицы 1xn, как если бы это было nxn, … Включите предупреждения при компиляции, затем исправьте свой код, пока у вас не будет 0 предупреждений. Это должно исправить, по крайней мере, неправильное приведение указателя.
3. Также вы не можете взять простой указатель на данные и начать использовать с ним синтаксис [ ][ ] . Для использования этого синтаксиса требуется несколько дополнительных шагов. Смотрите Здесь пример кода: mathworks.com/matlabcentral/answers /…