Set the number of columns
C Syntax
#include "matrix.h"
void mxSetN(mxArray *array_ptr, int n);
Arguments
array_ptr
Pointer to an mxArray
.
n
The desired number of columns.
Description
Call mxSetN
to set the number of columns in the specified mxArray
. The term "columns" always means the second dimension of a matrix. Calling mxSetN
forces an mxArray
to have two dimensions. For example, if array_ptr
points to an mxArray
having three dimensions, calling mxSetN
reduces the mxArray
to two dimensions.
You typically use mxSetN
to change the shape of an existing mxArray
. Note that mxSetN
does not allocate or deallocate any space for the pr
, pi
, ir
, or jc
arrays. Consequently, if your calls to mxSetN
and mxSetM
increase the number of elements in the mxArray
, then you must enlarge the pr
, pi
, ir
, and/or jc
arrays.
If your calls to mxSetM
and mxSetN
end up reducing the number of elements in the mxArray
, then you may want to reduce the size of the pr
, pi
, ir
, or jc
arrays in order to reduce heap space usage. However, reducing the size is not mandatory.
Examples
Consider a 3-by-3 mxArray
containing
10
|
14
|
20
|
12
|
17
|
22
|
13
|
18
|
23
|
Suppose you enlarge the mxArray
to 4-by-4 but preserve the positions of the original 3-by-3 to yield an mxArray
containing
10
|
14
|
20
|
0
|
12
|
17
|
22
|
0
|
13
|
18
|
23
|
0
|
0
|
0
|
0
|
0
|
The code to create the original 3-by-3 mxArray
and the expanded 4-by-4 mxArray
is
#define COLS_IN_OLD_ARRAY 3
#define ROWS_IN_OLD_ARRAY 3
#define ROWS_IN_NEW_ARRAY 4
mxArray *array_ptr;
double old_pr[9] = {10,12,13,14,17,18,20,22,23};
double *dest, *src, *new_heap_pr, *pr;
int col;
/* Create a 3-by-3 real-only mxArray of doubles. */
array_ptr = mxCreateDoubleMatrix(3, 3, mxREAL);
pr = mxGetPr(array_ptr);
memcpy((void *)pr,(const void *)old_pr,9*sizeof(double));
mxSetName(array_ptr, "Apricots");
...
/* Reshape Apricots into a 4-by-4 mxArray. */
mxSetM(array_ptr, 4);
mxSetN(array_ptr, 4);
/* Redo pr to respond to the new size of Apricots; preserve the
positions of the original 3-by-3. */
/* First, allocate heap to hold 16 real elements. */
new_heap_pr = (double *)mxCalloc(16, sizeof(double));
/* Next, copy the original 9 elements. */
for (col=0; col<COLS_IN_OLD_ARRAY; col++) {
dest = new_heap_pr + (ROWS_IN_NEW_ARRAY * col);
src = &old_pr[ROWS_IN_OLD_ARRAY * col];
memcpy(dest, src, ROWS_IN_OLD_ARRAY * sizeof(double));
}
/* First, deallocate the old pr data. */
mxFree(mxGetPr(array_ptr));
/* Then, associate the new data with the real data of Apricots. */
mxSetPr(array_ptr, new_heap_pr);
For an additional example, see mxsetn.c
in the mx
subdirectory of the examples
directory.
See Also
mxGetM
, mxGetN
, mxSetM
[ Previous | Help Desk | Next ]