root/library/bdm/base/itpp/itmex.h @ 1187

Revision 937, 27.3 kB (checked in by smidl, 14 years ago)

matlab class extension for pdf

Line 
1/*!
2 * \file
3 * \brief Conversion routines between IT++ and Matlab
4 * \author Tony Ottosson and Pal Frenger
5 *
6 * -------------------------------------------------------------------------
7 *
8 * IT++ - C++ library of mathematical, signal processing, speech processing,
9 *        and communications classes and functions
10 *
11 * Copyright (C) 1995-2009  (see AUTHORS file for a list of contributors)
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 * GNU General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 *
27 * -------------------------------------------------------------------------
28 */
29
30#ifndef ITMEX_H
31#define ITMEX_H
32
33#include <itpp/itbase.h>
34#include <mex.h>
35
36
37namespace itpp
38{
39
40//--------------------------------------------------------
41// mex -> it++
42//--------------------------------------------------------
43
44/*!
45  \addtogroup mexfiles
46  \brief Conversions between IT++ and Matlab for writing mex-files.
47  \author Tony Ottosson and Pal Frenger
48
49  These routines are used to help writng mex-files for speeding up
50  matlab simulations.
51  A simple mex-file that performs QPSK modulation is given below.
52
53  \code
54  #include <itpp/itcomm.h>
55  #include <itpp/itmex.h>
56
57  using namespace itpp;
58
59  void mexFunction(int n_output, mxArray *output[], int n_input, const mxArray *input[])
60  {
61  // Check the number of inputs and output arguments
62  if(n_output!=1) mexErrMsgTxt("Wrong number of output variables!");
63  if(n_input!=1) mexErrMsgTxt("Wrong number of input variables!");
64
65  // Convert input variables to IT++ format
66  bvec input_bits = mxArray2bvec(input[0]);
67
68  // ------------------ Start of routine ---------------------------
69  cvec output_symbols;
70  QPSK qpsk;
71
72  output_symbols = qpsk.modulate_bits(input_bits);
73  // ------------------ End of routine -----------------------------
74
75  // Create output vectors
76  output[0] = mxCreateDoubleMatrix(1,output_symbols.size(), mxCOMPLEX);
77
78  // Convert the IT++ format to Matlab format for output
79  cvec2mxArray(output_symbols, output[0]);
80  }
81  \endcode
82*/
83
84/*!
85 * \addtogroup mexfiles
86 * @{
87 */
88
89// --------------------------------------------------------
90// mex -> IT++
91// --------------------------------------------------------
92
93//! Convert the matlab-format mxArray to bin
94bin mxArray2bin(const mxArray *in);
95//! Convert the matlab-format mxArray to short
96short mxArray2short(const mxArray *in);
97//! Convert the matlab-format mxArray to int
98int mxArray2int(const mxArray *in);
99//! Convert the matlab-format mxArray to double
100double mxArray2double(const mxArray *in);
101//! Convert the matlab-format mxArray to complex<double>
102std::complex<double> mxArray2double_complex(const mxArray *in);
103//! Convert the matlab-format mxArray to string
104std::string mxArray2string(const mxArray *in);
105
106//! Convert the matlab-format mxArray to bvec
107bvec mxArray2bvec(const mxArray *in);
108//! Convert the matlab-format mxArray to svec
109svec mxArray2svec(const mxArray *in);
110//! Convert the matlab-format mxArray to ivec
111ivec mxArray2ivec(const mxArray *in);
112//! Convert the matlab-format mxArray to vec
113vec mxArray2vec(const mxArray *in);
114//! Convert the matlab-format mxArray to cvec
115cvec mxArray2cvec(const mxArray *in);
116
117//! Convert the matlab-format mxArray to bmat
118bmat mxArray2bmat(const mxArray *in);
119//! Convert the matlab-format mxArray to smat
120smat mxArray2smat(const mxArray *in);
121//! Convert the matlab-format mxArray to imat
122imat mxArray2imat(const mxArray *in);
123//! Convert the matlab-format mxArray to mat
124mat mxArray2mat(const mxArray *in);
125//! Convert the matlab-format mxArray to cmat
126cmat mxArray2cmat(const mxArray *in);
127
128// --------------------------------------------------------
129// IT++ -> mex
130// --------------------------------------------------------
131
132//! Convert bin to the matlab-format mxArray
133void bin2mxArray(const bin &in, mxArray *out);
134//! Convert short to the matlab-format mxArray
135void short2mxArray(const short &in, mxArray *out);
136//! Convert int to the matlab-format mxArray
137void int2mxArray(const int &in, mxArray *out);
138//! Convert double to the matlab-format mxArray
139void double2mxArray(const double &in, mxArray *out);
140//! Convert complex<double> to the matlab-format mxArray
141void double_complex2mxArray(const std::complex<double> &in, mxArray *out);
142//! Convert string to the matlab-format mxArray
143void string2mxArray(const std::string &in, mxArray* &out);
144
145//! Convert bvec to the matlab-format mxArray
146void bvec2mxArray(const bvec &in, mxArray *out);
147//! Convert svec to the matlab-format mxArray
148void svec2mxArray(const svec &in, mxArray *out);
149//! Convert ivec to the matlab-format mxArray
150void ivec2mxArray(const ivec &in, mxArray *out);
151//! Convert vec to the matlab-format mxArray
152void vec2mxArray(const vec &in, mxArray *out);
153//! Convert cvec to the matlab-format mxArray
154void cvec2mxArray(const cvec &in, mxArray *out);
155
156//! Convert bmat to the matlab-format mxArray
157void bmat2mxArray(const bmat &in, mxArray *out);
158//! Convert smat to the matlab-format mxArray
159void smat2mxArray(const smat &in, mxArray *out);
160//! Convert imat to the matlab-format mxArray
161void imat2mxArray(const imat &in, mxArray *out);
162//! Convert mat to the matlab-format mxArray
163void mat2mxArray(const mat &in, mxArray *out);
164//! Convert cmat to the matlab-format mxArray
165void cmat2mxArray(const cmat &in, mxArray *out);
166
167// --------------------------------------------------------
168// mex -> C
169// --------------------------------------------------------
170
171//! Convert the matlab-format mxArray to C-format pointer to short
172void mxArray2Csvec(const mxArray *in, short *out);
173//! Convert the matlab-format mxArray to C-format pointer to int
174void mxArray2Civec(const mxArray *in, int *out);
175//! Convert the matlab-format mxArray to C-format pointer to double
176void mxArray2Cvec(const mxArray *in, double *out);
177//! Convert the matlab-format mxArray to C-format pointers to double (real and imaginary parts)
178void mxArray2Ccvec(const mxArray *in, double *out_real, double *out_imag);
179
180//! Convert the matlab-format mxArray to C-format pointer to pointer to short
181void mxArray2Csmat(const mxArray *in, short **out);
182//! Convert the matlab-format mxArray to C-format pointer to pointer to int
183void mxArray2Cimat(const mxArray *in, int **out);
184//! Convert the matlab-format mxArray to C-format pointer to pointer to double
185void mxArray2Cmat(const mxArray *in, double **out);
186//! Convert the matlab-format mxArray to C-format pointer to pointer to double (real and imaginary parts)
187void mxArray2Ccmat(const mxArray *in, double **out_real, double **out_imag);
188
189// --------------------------------------------------------
190// C -> mex
191// --------------------------------------------------------
192
193//! Convert C-format pointer to short to matlab-format mxArray
194void Csvec2mxArray(short *in, mxArray *out);
195//! Convert C-format pointer to int to matlab-format mxArray
196void Civec2mxArray(int *in, mxArray *out);
197//! Convert C-format pointer to double to matlab-format mxArray
198void Cvec2mxArray(double *in, mxArray *out);
199//! Convert C-format pointers to double (real and imaginary parts) to matlab-format mxArray
200void Ccvec2mxArray(double *in_real, double *in_imag, mxArray *out);
201
202//! Convert C-format pointer to pointer to short to matlab-format mxArray
203void Csmat2mxArray(short **in, mxArray *out);
204//! Convert C-format pointer to pointer to int to matlab-format mxArray
205void Cimat2mxArray(int **in, mxArray *out);
206//! Convert C-format pointer to pointer to double to matlab-format mxArray
207void Cmat2mxArray(double **in, mxArray *out);
208//! Convert C-format pointer to pointer to double (real and imaginary parts) to matlab-format mxArray
209void Ccmat2mxArray(double **in_real, double **in_imag, mxArray *out);
210
211/*!
212 * @}
213 */
214
215
216bin mxArray2bin(const mxArray *in)
217{
218  int size;
219  double* temp = (double*) mxGetPr(in);
220  if (temp == 0) mexErrMsgTxt("mxArray2bin: Pointer to data is NULL");
221  size = mxGetNumberOfElements(in);
222  if (size != 1) mexErrMsgTxt("mxArray2bin: Size of data is not equal to one");
223
224  return (((*temp) > 0.0) ? bin(1) : bin(0));
225}
226
227short mxArray2short(const mxArray *in)
228{
229  int size;
230  double* temp = (double*) mxGetPr(in);
231  if (temp == 0) mexErrMsgTxt("mxArray2short: Pointer to data is NULL");
232  size = mxGetNumberOfElements(in);
233  if (size != 1) mexErrMsgTxt("mxArray2short: Size of data is not equal to one");
234
235  return (short)(*temp);
236}
237
238int mxArray2int(const mxArray *in)
239{
240  int size;
241  double* temp = (double*) mxGetPr(in);
242  if (temp == 0) mexErrMsgTxt("mxArray2int: Pointer to data is NULL");
243  size = mxGetNumberOfElements(in);
244  if (size != 1) mexErrMsgTxt("mxArray2int: Size of data is not equal to one");
245
246  return (int)(*temp);
247}
248
249double mxArray2double(const mxArray *in)
250{
251  int size;
252  double* temp = (double*) mxGetPr(in);
253  if (temp == 0) mexErrMsgTxt("mxArray2double: Pointer to data is NULL");
254  size = mxGetNumberOfElements(in);
255  if (size != 1) mexErrMsgTxt("mxArray2double: Size of data is not equal to one");
256
257  return (*temp);
258}
259
260std::complex<double> mxArray2double_complex(const mxArray *in)
261{
262  int size;
263  double* tempR = (double*) mxGetPr(in);
264  double* tempI = (double*) mxGetPi(in);
265
266  if ((tempR == 0) && (tempI == 0)) mexErrMsgTxt("mxArray2double_complex: Pointer to data is NULL");
267
268  size = mxGetNumberOfElements(in);
269  if (size != 1) mexErrMsgTxt("mxArray2double_complex: Size of data is not equal to one");
270
271  if (tempR == 0) {
272    return std::complex<double>(0.0 , (*tempI));
273  }
274  else if (tempI == 0) {
275    return std::complex<double>((*tempR), 0.0);
276  }
277  else {
278    return std::complex<double>((*tempR), (*tempI));
279  }
280
281}
282
283std::string mxArray2string(const mxArray *in)
284{
285  if (in == 0)
286    mexErrMsgTxt("mxArray2string: Pointer to data is NULL");
287  std::string str = mxArrayToString(in);
288  if (str.data() == 0)
289    mexErrMsgTxt("mxArray2string: Could not convert mxArray to string");
290  return str;
291}
292
293bvec mxArray2bvec(const mxArray *in)
294{
295  bvec out;
296  int i, size;
297  double* temp = (double*) mxGetPr(in);
298  if (temp == 0) mexErrMsgTxt("mxArray2bvec: Pointer to data is NULL");
299
300  size = mxGetNumberOfElements(in);
301  if (size == 0) mexErrMsgTxt("mxArray2bvec: Size of data is zero");
302
303  out.set_size(size, false);
304
305  for (i = 0; i < size; i++) {
306    out(i) = (((*temp++) > 1e-5) ? bin(1) : bin(0));
307  }
308
309  return out;
310
311}
312
313svec mxArray2svec(const mxArray *in)
314{
315  svec out;
316  int i, size;
317  double* temp = (double*) mxGetPr(in);
318  if (temp == 0) mexErrMsgTxt("mxArray2svec: Pointer to data is NULL");
319
320  size = mxGetNumberOfElements(in);
321  if (size == 0) mexErrMsgTxt("mxArray2svec: Size of data is zero");
322
323  out.set_size(size, false);
324
325  for (i = 0; i < size; i++) {
326    out(i) = (short)(*temp++);
327  }
328
329  return out;
330
331}
332
333ivec mxArray2ivec(const mxArray *in)
334{
335  ivec out;
336  int i, size;
337  double* temp = (double*) mxGetPr(in);
338
339  size = mxGetNumberOfElements(in);
340  if ((size > 0) && (temp == 0)) mexErrMsgTxt("mxArray2ivec: Size of data is zero");
341
342  out.set_size(size, false);
343
344  for (i = 0; i < size; i++) {
345    out(i) = (int)(*temp++);
346  }
347
348  return out;
349
350}
351
352vec mxArray2vec(const mxArray *in)
353{
354  vec out;
355  int i, size;
356  double* temp = (double*) mxGetPr(in);
357
358  size = mxGetNumberOfElements(in);
359  if ((size >0) && (temp == 0)) mexErrMsgTxt("mxArray2vec: Pointer to data is NULL");
360 
361  out.set_size(size, false);
362
363  for (i = 0; i < size; i++) {
364    out(i) = (*temp++);
365  }
366
367  return out;
368
369}
370
371cvec mxArray2cvec(const mxArray *in)
372{
373  cvec out;
374  int i, size;
375  double* tempR = (double*) mxGetPr(in);
376  double* tempI = (double*) mxGetPi(in);
377
378  if ((tempR == 0) && (tempI == 0)) mexErrMsgTxt("mxArray2cvec: Pointer data is NULL");
379
380  size = mxGetNumberOfElements(in);
381  if (size == 0) mexErrMsgTxt("mxArray2cvec: Size of data is zero");
382
383  out.set_size(size, false);
384
385  if (tempR == 0) {
386    for (i = 0; i < size; i++) { out(i) = std::complex<double>(0.0, (*tempI++)); }
387  }
388  else if (tempI == 0) {
389    for (i = 0; i < size; i++) { out(i) = std::complex<double>((*tempR++), 0.0); }
390  }
391  else {
392    for (i = 0; i < size; i++) { out(i) = std::complex<double>((*tempR++), (*tempI++)); }
393  }
394
395  return out;
396
397}
398
399bmat mxArray2bmat(const mxArray *in)
400{
401  bmat out;
402  int r, c, rows, cols;
403  double* temp = (double*) mxGetPr(in);
404  if (temp == 0) mexErrMsgTxt("mxArray2bmat: Pointer to data is NULL");
405
406  rows = mxGetM(in);
407  if (rows == 0) mexErrMsgTxt("mxArray2bmat: Data has zero rows");
408  cols = mxGetN(in);
409  if (cols == 0) mexErrMsgTxt("mxArray2bmat: Data has zero columns");
410
411  out.set_size(rows, cols, false);
412
413  for (c = 0; c < cols; c++) {
414    for (r = 0; r < rows; r++) {
415      out(r, c) = (((*temp++) > 0.0) ? bin(1) : bin(0));
416    }
417  }
418
419  return out;
420
421}
422
423smat mxArray2smat(const mxArray *in)
424{
425  smat out;
426  int r, c, rows, cols;
427  double* temp = (double*) mxGetPr(in);
428  if (temp == 0) mexErrMsgTxt("mxArray2smat: Pointer to data is NULL");
429
430  rows = mxGetM(in);
431  if (rows == 0) mexErrMsgTxt("mxArray2smat: Data has zero rows");
432  cols = mxGetN(in);
433  if (cols == 0) mexErrMsgTxt("mxArray2smat: Data has zero columns");
434
435  out.set_size(rows, cols, false);
436
437  for (c = 0; c < cols; c++) {
438    for (r = 0; r < rows; r++) {
439      out(r, c) = (short)(*temp++);
440    }
441  }
442
443  return out;
444
445}
446
447imat mxArray2imat(const mxArray *in)
448{
449  imat out;
450  int r, c, rows, cols;
451  double* temp = (double*) mxGetPr(in);
452  if (temp == 0) mexErrMsgTxt("mxArray2imat: Pointer to data is NULL");
453
454  rows = mxGetM(in);
455  if (rows == 0) mexErrMsgTxt("mxArray2imat: Data has zero rows");
456  cols = mxGetN(in);
457  if (cols == 0) mexErrMsgTxt("mxArray2imat: Data has zero columns");
458  out.set_size(rows, cols, false);
459
460  for (c = 0; c < cols; c++) {
461    for (r = 0; r < rows; r++) {
462      out(r, c) = (int)(*temp++);
463    }
464  }
465
466  return out;
467
468}
469
470mat mxArray2mat(const mxArray *in)
471{
472  mat out;
473  int r, c, rows, cols;
474  double* temp = (double*) mxGetPr(in);
475  if (temp == 0) mexErrMsgTxt("mxArray2mat: Pointer to data is NULL");
476
477  rows = mxGetM(in);
478  if (rows == 0) mexErrMsgTxt("mxArray2mat: Data has zero rows");
479  cols = mxGetN(in);
480  if (cols == 0) mexErrMsgTxt("mxArray2mat: Data has zero columns");
481  out.set_size(rows, cols, false);
482
483  for (c = 0; c < cols; c++) {
484    for (r = 0; r < rows; r++) {
485      out(r, c) = (*temp++);
486    }
487  }
488
489  return out;
490
491}
492
493cmat mxArray2cmat(const mxArray *in)
494{
495  cmat out;
496  int r, c, rows, cols;
497  double* tempR = (double*) mxGetPr(in);
498  double* tempI = (double*) mxGetPi(in);
499
500  if ((tempR == 0) && (tempI == 0)) mexErrMsgTxt("mxArray2cmat: Pointer to data is NULL");
501
502  rows = mxGetM(in);
503  if (rows == 0) mexErrMsgTxt("mxArray2cmat: Data has zero rows");
504  cols = mxGetN(in);
505  if (cols == 0) mexErrMsgTxt("mxArray2cmat: Data has zero columns");
506  out.set_size(rows, cols, false);
507
508  if (tempR == 0) {
509    for (c = 0; c < cols; c++) { for (r = 0; r < rows; r++) { out(r, c) = std::complex<double>(0.0 , (*tempI++)); } }
510  }
511  else if (tempI == 0) {
512    for (c = 0; c < cols; c++) { for (r = 0; r < rows; r++) { out(r, c) = std::complex<double>((*tempR++), 0.0); } }
513  }
514  else {
515    for (c = 0; c < cols; c++) { for (r = 0; r < rows; r++) { out(r, c) = std::complex<double>((*tempR++), (*tempI++)); } }
516  }
517
518  return out;
519
520}
521
522void double2mxArray(const double &in, mxArray *out)
523{
524  double* temp = (double *) mxGetPr(out);
525  if (temp == 0) mexErrMsgTxt("double2mxArray: Pointer to data is NULL");
526
527  *temp = (double) in;
528}
529
530void double_complex2mxArray(const std::complex<double> &in, mxArray *out)
531{
532  double* tempR = (double *) mxGetPr(out);
533  double* tempI = (double *) mxGetPi(out);
534  if (tempR == 0) mexErrMsgTxt("double_complex2mxArray: Pointer to real valued part is NULL");
535  if (tempI == 0) mexErrMsgTxt("double_complex2mxArray: Pointer to imaginary valued part is NULL");
536
537  *tempR = (double) in.real();
538  *tempI = (double) in.imag();
539}
540
541void string2mxArray(const std::string &in, mxArray* &out)
542{
543  if (in.data() == 0)
544    mexErrMsgTxt("string2mxArray: Pointer to string is NULL");
545  out = mxCreateString(in.data());
546  if (out == 0)
547    mexErrMsgTxt("string2mxArray: Could not convert string to mxArray");
548}
549
550void bvec2mxArray(const bvec &in, mxArray *out)
551{
552  double* temp = (double *) mxGetPr(out);
553  if (temp == 0) mexErrMsgTxt("bvec2mxArray: Pointer to data is NULL");
554  if (in.size() == 0) mexErrMsgTxt("bvec2mxArray: Size of data is zero");
555  for (int i = 0; i < in.size(); i++) {
556    if (in(i))
557      *temp++ = 1.0;
558    else
559      *temp++ = 0.0;
560  }
561}
562
563void ivec2mxArray(const ivec &in, mxArray *out)
564{
565  double* temp = (double *) mxGetPr(out);
566  if (temp == 0) mexErrMsgTxt("ivec2mxArray: Pointer to data is NULL");
567  if (in.size() == 0) mexErrMsgTxt("ivec2mxArray: Size of data is zero");
568
569  for (int i = 0; i < in.size(); i++) {
570    *temp++ = (double) in(i);
571  }
572}
573
574void vec2mxArray(const vec &in, mxArray *out)
575{
576  double* temp = (double *) mxGetPr(out);
577  if ((in.size() > 0) && (temp == 0)) mexErrMsgTxt("vec2mxArray: Pointer to data is NULL");
578
579  for (int i = 0; i < in.size(); i++) {
580    *temp++ = (double) in(i);
581  }
582}
583
584void cvec2mxArray(const cvec &in, mxArray *out)
585{
586  double* tempR = (double *) mxGetPr(out);
587  double* tempI = (double *) mxGetPi(out);
588  if (tempR == 0) mexErrMsgTxt("cvec2mxArray: Pointer to real valued part is NULL");
589  if (tempI == 0) mexErrMsgTxt("cvec2mxArray: Pointer to imaginary valued part is NULL");
590  if (in.size() == 0) mexErrMsgTxt("cvec2mxArray: Size of data is zero");
591
592  for (int i = 0; i < in.size(); i++) {
593    *tempR++ = (double) in(i).real();
594    *tempI++ = (double) in(i).imag();
595  }
596}
597
598void bmat2mxArray(const bmat &in, mxArray *out)
599{
600  int rows, cols, r, c;
601
602  double* temp = (double *) mxGetPr(out);
603  if (temp == 0) mexErrMsgTxt("bmat2mxArray: Pointer to data is NULL");
604
605  rows = in.rows();
606  cols = in.cols();
607  if (rows == 0) mexErrMsgTxt("bmat2mxArray: Data has zero rows");
608  if (cols == 0) mexErrMsgTxt("bmat2mxArray: Data has zero columns");
609
610  for (c = 0; c < cols; c++) {
611    for (r = 0; r < rows; r++) {
612      if (in(r, c))
613        *temp++ = 1.0;
614      else
615        *temp++ = 0.0;
616    }
617  }
618
619}
620
621void smat2mxArray(const smat &in, mxArray *out)
622{
623  int rows, cols, r, c;
624
625  double* temp = (double *) mxGetPr(out);
626  if (temp == 0) mexErrMsgTxt("smat2mxArray: Pointer to data is NULL");
627
628  rows = in.rows();
629  cols = in.cols();
630  if (rows == 0) mexErrMsgTxt("smat2mxArray: Data has zero rows");
631  if (cols == 0) mexErrMsgTxt("smat2mxArray: Data has zero columns");
632
633  for (c = 0; c < cols; c++) {
634    for (r = 0; r < rows; r++) {
635      *temp++ = (double) in(r, c);
636    }
637  }
638
639}
640
641void imat2mxArray(const imat &in, mxArray *out)
642{
643  int rows, cols, r, c;
644
645  double* temp = (double *) mxGetPr(out);
646  if (temp == 0) mexErrMsgTxt("imat2mxArray: Pointer to data is NULL");
647
648  rows = in.rows();
649  cols = in.cols();
650  if (rows == 0) mexErrMsgTxt("imat2mxArray: Data has zero rows");
651  if (cols == 0) mexErrMsgTxt("imat2mxArray: Data has zero columns");
652
653  for (c = 0; c < cols; c++) {
654    for (r = 0; r < rows; r++) {
655      *temp++ = (double) in(r, c);
656    }
657  }
658
659}
660
661void mat2mxArray(const mat &in, mxArray *out)
662{
663  int rows, cols, r, c;
664
665  double* temp = (double *) mxGetPr(out);
666  if (temp == 0) mexErrMsgTxt("mat2mxArray: Pointer to data is NULL");
667
668  rows = in.rows();
669  cols = in.cols();
670  if (rows == 0) mexErrMsgTxt("mat2mxArray: Data has zero rows");
671  if (cols == 0) mexErrMsgTxt("mat2mxArray: Data has zero columns");
672
673  for (c = 0; c < cols; c++) {
674    for (r = 0; r < rows; r++) {
675      *temp++ = in(r, c);
676    }
677  }
678
679}
680
681void cmat2mxArray(const cmat &in, mxArray *out)
682{
683  int rows, cols, r, c;
684
685  double* tempR = (double *) mxGetPr(out);
686  double* tempI = (double *) mxGetPi(out);
687  if (tempR == 0) mexErrMsgTxt("cvec2mxArray: Pointer to real valued part is NULL");
688  if (tempI == 0) mexErrMsgTxt("cvec2mxArray: Pointer to imaginary valued part is NULL");
689
690  rows = in.rows();
691  cols = in.cols();
692  if (rows == 0) mexErrMsgTxt("cvec2mxArray: Data has zero rows");
693  if (cols == 0) mexErrMsgTxt("cvec2mxArray: Data has zero columns");
694
695  for (c = 0; c < cols; c++) {
696    for (r = 0; r < rows; r++) {
697      *tempR++ = (double) in(r, c).real();
698      *tempI++ = (double) in(r, c).imag();
699    }
700  }
701
702}
703
704void mxArray2Csvec(const mxArray *in, short *out)
705{
706  double* temp = (double*) mxGetPr(in);
707  if (temp == 0) mexErrMsgTxt("mxArray2Csvec: Pointer to data is NULL");
708  int size = mxGetNumberOfElements(in);
709  if (size == 0) mexErrMsgTxt("mxArray2Csvec: Size of data is zero");
710  for (int i = 0; i < size; i++) { out[i] = (short)(*temp++); }
711}
712
713void mxArray2Civec(const mxArray *in, int *out)
714{
715  double* temp = (double*) mxGetPr(in);
716  if (temp == 0) mexErrMsgTxt("mxArray2Civec: Pointer to data is NULL");
717  int size = mxGetNumberOfElements(in);
718  if (size == 0) mexErrMsgTxt("mxArray2Civec: Size of data is zero");
719  for (int i = 0; i < size; i++) { out[i] = (int)(*temp++); }
720}
721
722void mxArray2Cvec(const mxArray *in, double *out)
723{
724  double* temp = (double*) mxGetPr(in);
725  if (temp == 0) mexErrMsgTxt("mxArray2Cvec: Pointer to data is NULL");
726  int size = mxGetNumberOfElements(in);
727  if (size == 0) mexErrMsgTxt("mxArray2Cvec: Size of data is zero");
728  for (int i = 0; i < size; i++) { out[i] = (*temp++); }
729}
730
731void mxArray2Ccvec(const mxArray *in, double *out_real, double *out_imag)
732{
733  double* tempR = (double*) mxGetPr(in);
734  double* tempI = (double*) mxGetPi(in);
735  if (tempR == 0) mexErrMsgTxt("mxArray2Ccvec: Pointer to real valued part is NULL");
736  if (tempI == 0) mexErrMsgTxt("mxArray2Ccvec: Pointer to imaginary valued part is NULL");
737  int size = mxGetNumberOfElements(in);
738  if (size == 0) mexErrMsgTxt("mxArray2Ccvec: Size of data is zero");
739  for (int i = 0; i < size; i++) { out_real[i] = (*tempR++); out_imag[i] = (*tempI++); }
740}
741
742void mxArray2Csmat(const mxArray *in, short **out)
743{
744  int r, c;
745  double* temp = (double*) mxGetPr(in);
746  if (temp == 0) mexErrMsgTxt("mxArray2Csmat: Pointer to data is NULL");
747  int rows = mxGetM(in);
748  if (rows == 0) mexErrMsgTxt("mxArray2Csmat: Data has zero rows");
749  int cols = mxGetN(in);
750  if (cols == 0) mexErrMsgTxt("mxArray2Csmat: Data has zero columns");
751  for (c = 0; c < cols; c++) {
752    for (r = 0; r < rows; r++) {
753      out[r][c] = (short)(*temp++);
754    }
755  }
756}
757
758void mxArray2Cimat(const mxArray *in, int **out)
759{
760  int r, c;
761  double* temp = (double*) mxGetPr(in);
762  if (temp == 0) mexErrMsgTxt("mxArray2Cimat: Pointer to data is NULL");
763  int rows = mxGetM(in);
764  if (rows == 0) mexErrMsgTxt("mxArray2Cimat: Data has zero rows");
765  int cols = mxGetN(in);
766  if (cols == 0) mexErrMsgTxt("mxArray2Cimat: Data has zero columns");
767  for (c = 0; c < cols; c++) {
768    for (r = 0; r < rows; r++) {
769      out[r][c] = (int)(*temp++);
770    }
771  }
772}
773
774void mxArray2Cmat(const mxArray *in, double **out)
775{
776  int r, c;
777  double* temp = (double*) mxGetPr(in);
778  if (temp == 0) mexErrMsgTxt("mxArray2Cmat: Pointer to data is NULL");
779  int rows = mxGetM(in);
780  if (rows == 0) mexErrMsgTxt("mxArray2Cmat: Data has zero rows");
781  int cols = mxGetN(in);
782  if (cols == 0) mexErrMsgTxt("mxArray2Cmat: Data has zero columns");
783  for (c = 0; c < cols; c++) {
784    for (r = 0; r < rows; r++) {
785      out[r][c] = (*temp++);
786    }
787  }
788}
789
790void mxArray2Ccmat(const mxArray *in, double **out_real, double **out_imag)
791{
792  int r, c;
793  double* tempR = (double*) mxGetPr(in);
794  double* tempI = (double*) mxGetPi(in);
795  if (tempR == 0) mexErrMsgTxt("mxArray2Cmat: Pointer to real valued part is NULL");
796  if (tempI == 0) mexErrMsgTxt("mxArray2Cmat: Pointer to imaginary valued part is NULL");
797  int rows = mxGetM(in);
798  if (rows == 0) mexErrMsgTxt("mxArray2Cmat: Data has zero rows");
799  int cols = mxGetN(in);
800  if (cols == 0) mexErrMsgTxt("mxArray2Cmat: Data has zero columns");
801  for (c = 0; c < cols; c++) {
802    for (r = 0; r < rows; r++) {
803      out_real[r][c] = (*tempR++);
804      out_imag[r][c] = (*tempI++);
805    }
806  }
807}
808
809void Csvec2mxArray(short *in, mxArray *out)
810{
811  double* temp = (double *) mxGetPr(out);
812  if (temp == 0) mexErrMsgTxt("Csvec2mxArray: Pointer to data is NULL");
813  int size = mxGetNumberOfElements(out);
814  if (size == 0) mexErrMsgTxt("Csvec2mxArray: Size of data is zero");
815  for (int i = 0; i < size; i++) { *temp++ = (double) in[i]; }
816}
817
818void Civec2mxArray(int *in, mxArray *out)
819{
820  double* temp = (double *) mxGetPr(out);
821  if (temp == 0) mexErrMsgTxt("Civec2mxArray: Pointer to data is NULL");
822  int size = mxGetNumberOfElements(out);
823  if (size == 0) mexErrMsgTxt("Civec2mxArray: Size of data is zero");
824  for (int i = 0; i < size; i++) { *temp++ = (double) in[i]; }
825}
826
827void Cvec2mxArray(double *in, mxArray *out)
828{
829  double* temp = (double *) mxGetPr(out);
830  if (temp == 0) mexErrMsgTxt("Cvec2mxArray: Pointer to data is NULL");
831  int size = mxGetNumberOfElements(out);
832  if (size == 0) mexErrMsgTxt("Cvec2mxArray: Size of data is zero");
833  for (int i = 0; i < size; i++) { *temp++ = in[i]; }
834}
835
836void Ccvec2mxArray(double *in_real, double *in_imag, mxArray *out)
837{
838  double* tempR = (double *) mxGetPr(out);
839  double* tempI = (double *) mxGetPi(out);
840  if (tempR == 0) mexErrMsgTxt("Ccvec2mxArray: Pointer to real valued part is NULL");
841  if (tempI == 0) mexErrMsgTxt("Ccvec2mxArray: Pointer to imaginary valued part is NULL");
842  int size = mxGetNumberOfElements(out);
843  if (size == 0) mexErrMsgTxt("Ccvec2mxArray: Size of data is zero");
844  for (int i = 0; i < size; i++) { *tempR++ = in_real[i]; *tempI++ = in_imag[i]; }
845}
846
847void Csmat2mxArray(short **in, mxArray *out)
848{
849  int r, c;
850  double* temp = (double *) mxGetPr(out);
851  if (temp == 0) mexErrMsgTxt("Csmat2mxArray: Pointer to data is NULL");
852  int rows = mxGetM(out);
853  if (rows == 0) mexErrMsgTxt("Csmat2mxArray: Data has zero rows");
854  int cols = mxGetN(out);
855  if (cols == 0) mexErrMsgTxt("Csmat2mxArray: Data has zero columns");
856  for (c = 0; c < cols; c++) {
857    for (r = 0; r < rows; r++) {
858      *temp++ = (short) in[r][c];
859    }
860  }
861}
862
863void Cimat2mxArray(int **in, mxArray *out)
864{
865  int r, c;
866  double* temp = (double *) mxGetPr(out);
867  if (temp == 0) mexErrMsgTxt("Cimat2mxArray: Pointer to data is NULL");
868  int rows = mxGetM(out);
869  if (rows == 0) mexErrMsgTxt("Cimat2mxArray: Data has zero rows");
870  int cols = mxGetN(out);
871  if (cols == 0) mexErrMsgTxt("Cimat2mxArray: Data has zero columns");
872  for (c = 0; c < cols; c++) {
873    for (r = 0; r < rows; r++) {
874      *temp++ = (int) in[r][c];
875    }
876  }
877}
878
879void Cmat2mxArray(double **in, mxArray *out)
880{
881  int r, c;
882  double* temp = (double *) mxGetPr(out);
883  if (temp == 0) mexErrMsgTxt("Cmat2mxArray: Pointer to data is NULL");
884  int rows = mxGetM(out);
885  if (rows == 0) mexErrMsgTxt("Cmat2mxArray: Data has zero rows");
886  int cols = mxGetN(out);
887  if (cols == 0) mexErrMsgTxt("Cmat2mxArray: Data has zero columns");
888  for (c = 0; c < cols; c++) {
889    for (r = 0; r < rows; r++) {
890      *temp++ = in[r][c];
891    }
892  }
893}
894
895void Ccmat2mxArray(double **in_real, double **in_imag, mxArray *out)
896{
897  int r, c;
898  double* tempR = (double *) mxGetPr(out);
899  double* tempI = (double *) mxGetPi(out);
900  if (tempR == 0) mexErrMsgTxt("Ccmat2mxArray: Pointer to real valued part is NULL");
901  if (tempI == 0) mexErrMsgTxt("Ccmat2mxArray: Pointer to imaginary valued part is NULL");
902  int rows = mxGetM(out);
903  if (rows == 0) mexErrMsgTxt("Ccmat2mxArray: Data has zero rows");
904  int cols = mxGetN(out);
905  if (cols == 0) mexErrMsgTxt("Ccmat2mxArray: Data has zero columns");
906  for (c = 0; c < cols; c++) {
907    for (r = 0; r < rows; r++) {
908      *tempR++ = in_real[r][c];
909      *tempI++ = in_imag[r][c];
910    }
911  }
912}
913
914} // namespace itpp
915
916#endif // #ifndef ITMEX_H
Note: See TracBrowser for help on using the browser.