📄 matrixdriver.c
字号:
/*=================================================================
*
* MATRIXDRIVER.C Sample driver code that calls the shared
* library created using MATLAB Compiler. Refer to the
* documentation of MATLAB Compiler for more information on
* this
*
* This is the wrapper C code to call a shared library created
* using MATLAB Compiler.
*
* Copyright 1984-2005 The MathWorks, Inc.
*
*=================================================================*/
#include <stdio.h>
#ifdef __APPLE_CC__
#include <CoreFoundation/CoreFoundation.h>
#endif
/* Include the MCR header file and the library specific header file
* as generated by MATLAB Compiler */
#include "libmatrix.h"
/* This function is used to display a double matrix stored in an mxArray */
void display(const mxArray* in);
void *run_main(void *x)
{
int *err = x;
mxArray *in1, *in2; /* Define input parameters */
mxArray *out = NULL;/* and output parameters to be passed to the library functions */
double data[] = {1,2,3,4,5,6,7,8,9};
/* Call the mclInitializeApplication routine. Make sure that the application
* was initialized properly by checking the return status. This initialization
* has to be done before calling any MATLAB API's or MATLAB Compiler generated
* shared library functions. */
if( !mclInitializeApplication(NULL,0) )
{
fprintf(stderr, "Could not initialize the application.\n");
*err = -1;
return(x);
}
/* Create the input data */
in1 = mxCreateDoubleMatrix(3,3,mxREAL);
in2 = mxCreateDoubleMatrix(3,3,mxREAL);
memcpy(mxGetPr(in1), data, 9*sizeof(double));
memcpy(mxGetPr(in2), data, 9*sizeof(double));
/* Call the library intialization routine and make sure that the
* library was initialized properly. */
if (!libmatrixInitialize()){
fprintf(stderr,"Could not initialize the library.\n");
*err = -2;
}
else
{
/* Call the library function */
mlfAddmatrix(1, &out, in1, in2);
/* Display the return value of the library function */
printf("The value of added matrix is:\n");
display(out);
/* Destroy the return value since this varaible will be resued in
* the next function call. Since we are going to reuse the variable,
* we have to set it to NULL. Refer to MATLAB Compiler documentation
* for more information on this. */
mxDestroyArray(out); out=0;
mlfMultiplymatrix(1, &out, in1, in2);
printf("The value of the multiplied matrix is:\n");
display(out);
mxDestroyArray(out); out=0;
mlfEigmatrix(1, &out, in1);
printf("The eigenvalues of the first matrix are:\n");
display(out);
mxDestroyArray(out); out=0;
/* Call the library termination routine */
libmatrixTerminate();
/* Free the memory created */
mxDestroyArray(in1); in1=0;
mxDestroyArray(in2); in2 = 0;
}
/* On MAC, you need to call mclSetExitCode with the appropriate exit status
* Also, note that you should call mclTerminate application in the end of
* your application. mclTerminateApplication terminates the entire
* application and exits with the exit code set using mclSetExitCode. Note
* that this behavior is only on MAC platform.
*/
#ifdef __APPLE_CC__
mclSetExitCode(*err);
#endif
mclTerminateApplication();
return 0;
}
/*DISPLAY This function will display the double matrix stored in an mxArray.
* This function assumes that the mxArray passed as input contains double
* array.
*/
void display(const mxArray* in)
{
int i=0, j=0; /* loop index variables */
int r=0, c=0; /* variables to store the row and column length of the matrix */
double *data; /* variable to point to the double data stored within the mxArray */
/* Get the size of the matrix */
r = mxGetM(in);
c = mxGetN(in);
/* Get a pointer to the double data in mxArray */
data = mxGetPr(in);
/* Loop through the data and display the same in matrix format */
for( i = 0; i < c; i++ ){
for( j = 0; j < r; j++){
printf("%4.2f\t",data[j*c+i]);
}
printf("\n");
}
printf("\n");
}
int main()
{
int err = 0;
#ifdef __APPLE_CC__
pthread_t id;
pthread_create(&id, NULL, run_main, &err);
CFRunLoopSourceContext sourceContext;
sourceContext.version = 0;
sourceContext.info = NULL;
sourceContext.retain = NULL;
sourceContext.release = NULL;
sourceContext.copyDescription = NULL;
sourceContext.equal = NULL;
sourceContext.hash = NULL;
sourceContext.schedule = NULL;
sourceContext.cancel = NULL;
sourceContext.perform = NULL;
CFRunLoopSourceRef sourceRef = CFRunLoopSourceCreate(NULL, 0, &sourceContext);
CFRunLoopAddSource(CFRunLoopGetCurrent(), sourceRef, kCFRunLoopCommonModes);
CFRunLoopRun();
#else
run_main(&err);
#endif
return err;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -