source: issm/trunk/src/c/matlab/io/MatlabMatrixToDoubleMatrix.cpp@ 12706

Last change on this file since 12706 was 12706, checked in by Mathieu Morlighem, 13 years ago

merged trunk-jpl and trunk for revision 12703

File size: 2.9 KB
Line 
1/* \file MatlabMatrixToDoubleMatrix.cpp
2 * \brief: convert a sparse or dense matlab matrix to a double* pointer
3 */
4
5#ifdef HAVE_CONFIG_H
6 #include <config.h>
7#else
8#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9#endif
10
11/*Matlab includes: */
12#include "mex.h"
13#include "../../shared/shared.h"
14
15int MatlabMatrixToDoubleMatrix(double** pmatrix,int* pmatrix_rows,int* pmatrix_cols,const mxArray* mxmatrix){
16
17 int i,j,count,rows,cols;
18
19 /*output: */
20 double* matrix=NULL;
21
22 /*matlab indices: */
23 mwIndex* ir=NULL;
24 mwIndex* jc=NULL;
25
26 /*Ok, first check if we are dealing with a sparse or full matrix: */
27 if (mxIsSparse(mxmatrix)){
28
29 /*Dealing with sparse matrix: recover size first: */
30 double* pmxmatrix=(double*)mxGetPr(mxmatrix);
31 rows=mxGetM(mxmatrix);
32 cols=mxGetN(mxmatrix);
33
34 if(rows*cols){
35 matrix=xNewZeroInit<double>(rows*cols);
36
37 /*Now, get ir,jc and pr: */
38 ir=mxGetIr(mxmatrix);
39 jc=mxGetJc(mxmatrix);
40
41 /*Now, start inserting data into double* matrix: */
42 count=0;
43 for(i=0;i<cols;i++){
44 for(j=0;j<(jc[i+1]-jc[i]);j++){
45 matrix[rows*ir[count]+i]=pmxmatrix[count];
46 count++;
47 }
48 }
49 }
50
51 }
52 else if(mxIsClass(mxmatrix,"double")){
53 /*Dealing with dense matrix: recover pointer and size: */
54 double* pmxmatrix=(double*)mxGetPr(mxmatrix);
55 rows=mxGetM(mxmatrix);
56 cols=mxGetN(mxmatrix);
57
58 /*Create serial matrix: */
59 if(rows*cols){
60 matrix=xNewZeroInit<double>(rows*cols);
61
62 for(i=0;i<rows;i++){
63 for(j=0;j<cols;j++){
64 matrix[cols*i+j]=(double)pmxmatrix[rows*j+i];
65 }
66 }
67 }
68 }
69 else if(mxIsClass(mxmatrix,"single")){
70 /*Dealing with dense matrix: recover pointer and size: */
71 float *pmxmatrix=(float*)mxGetPr(mxmatrix);
72 rows=mxGetM(mxmatrix);
73 cols=mxGetN(mxmatrix);
74
75 /*Create serial matrix: */
76 if(rows*cols){
77 matrix=xNewZeroInit<double>(rows*cols);
78
79 for(i=0;i<rows;i++){
80 for(j=0;j<cols;j++){
81 matrix[cols*i+j]=(double)pmxmatrix[rows*j+i];
82 }
83 }
84 }
85 }
86 else if(mxIsClass(mxmatrix,"int16")){
87 /*Dealing with dense matrix: recover pointer and size: */
88 short int *pmxmatrix=(short*)mxGetPr(mxmatrix);
89 rows=mxGetM(mxmatrix);
90 cols=mxGetN(mxmatrix);
91
92 /*Create serial matrix: */
93 if(rows*cols){
94 matrix=xNewZeroInit<double>(rows*cols);
95
96 for(i=0;i<rows;i++){
97 for(j=0;j<cols;j++){
98 matrix[cols*i+j]=(double)pmxmatrix[rows*j+i];
99 }
100 }
101 }
102 }
103 else if(mxIsClass(mxmatrix,"uint8")){
104 /*Dealing with dense matrix: recover pointer and size: */
105 char *pmxmatrix=(char*)mxGetPr(mxmatrix);
106 rows=mxGetM(mxmatrix);
107 cols=mxGetN(mxmatrix);
108
109 /*Create serial matrix: */
110 if(rows*cols){
111 matrix=xNewZeroInit<double>(rows*cols);
112
113 for(i=0;i<rows;i++){
114 for(j=0;j<cols;j++){
115 matrix[cols*i+j]=(double)pmxmatrix[rows*j+i];
116 }
117 }
118 }
119 }
120 else{
121 _error2_("Matlab matrix type Not implemented yet");
122 }
123
124 /*Assign output pointer: */
125 *pmatrix=matrix;
126 *pmatrix_rows=rows;
127 *pmatrix_cols=cols;
128
129 return 1;
130}
Note: See TracBrowser for help on using the repository browser.