<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813</link>
    <title>MATLAB Central Newsreader - Inplace array (mex)</title>
    <description>Feed for thread: Inplace array (mex)</description>
    <language>en-us</language>
    <copyright>&amp;copy;1994-2012 by MathWorks, Inc.</copyright>
    <webmaster>webmaster@mathworks.com</webmaster>
    <generator>MATLAB Central Newsreader</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <ttl>60</ttl>
    <image>
      <title>MathWorks</title>
      <url>http://www.mathworks.com/images/membrane_icon.gif</url>
    </image>
    <item>
      <pubDate>Sat, 27 Jun 2009 12:41:01 -0400</pubDate>
      <title>Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660892</link>
      <author>Bruno Luong</author>
      <description>I want to create an inplace column vector using MEX. The idea is to create a column array that has its data pointer points on the the data block of an existing (input) matrix. Everything going well until I set the data pointer. Then it crashes &lt;br&gt;
&lt;br&gt;
a=rand(1,7)&lt;br&gt;
&lt;br&gt;
a =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.8147    0.9058    0.1270    0.9134    0.6324    0.0975    0.2785&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; b=inplacecolumn(a,3)&lt;br&gt;
&lt;br&gt;
Am I allowed to do such thing? If not what cause the crash?&lt;br&gt;
&lt;br&gt;
Bruno&lt;br&gt;
&lt;br&gt;
/* Here is my INPLACECOLUMN MEX function&lt;br&gt;
&lt;br&gt;
/*************************************************************************&lt;br&gt;
&amp;nbsp;* function b = inplacecolumn(a, k)&lt;br&gt;
&amp;nbsp;* Return the inplace-column a(:,k)&lt;br&gt;
&amp;nbsp;************************************************************************/&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
#include &quot;matrix.h&quot;&lt;br&gt;
&lt;br&gt;
/* Gateway of inplacecolumn */&lt;br&gt;
void mexFunction(int nlhs, mxArray *plhs[],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int nrhs, const mxArray *prhs[]) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mwSize k, N, M;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double *Pr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Check arguments */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nrhs&amp;lt;2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Two input arguments required.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!mxIsNumeric(prhs[0]))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: First input LIST argument must be numeric.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!mxIsNumeric(prhs[1]))                              &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be numeric.&quot;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M = mxGetM(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N = mxGetN(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Get the column number k */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mxGetM(prhs[1])!=1 || mxGetN(prhs[1])!=1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be a scalar.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mxGetClassID(prhs[1]) != mxDOUBLE_CLASS)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be a double.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = (mwSize)(*mxGetPr(prhs[1]));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (k&amp;lt;1 || k&amp;gt;N)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: K is not valid.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Create the Matrix result (first output) */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plhs[0] = mxCreateNumericMatrix(0, 0, mxDOUBLE_CLASS, mxREAL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pr = mxGetPr(plhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxFree(Pr);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Set the dimension as one column */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetM(plhs[0], M);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetN(plhs[0], 1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Inplace data pointer */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pr = mxGetPr(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Ir crashes here when k&amp;gt;1 */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetPr(plhs[0], Pr+((k-1)*M));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br&gt;
&lt;br&gt;
} /* Gateway of INPLACECOLUMN.c */</description>
    </item>
    <item>
      <pubDate>Sat, 27 Jun 2009 20:27:01 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660952</link>
      <author>James Tursa</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;h2540t$73d$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; I want to create an inplace column vector using MEX. The idea is to create a column array that has its data pointer points on the the data block of an existing (input) matrix. Everything going well until I set the data pointer. Then it crashes &lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a=rand(1,7)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; a =&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt;     0.8147    0.9058    0.1270    0.9134    0.6324    0.0975    0.2785&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;&amp;gt; b=inplacecolumn(a,3)&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Am I allowed to do such thing? If not what cause the crash?&lt;br&gt;
&lt;br&gt;
No. You cannot do this. The problem is what happens when variables get cleared. If &quot;a&quot; gets cleared, the MATLAB memory manager knows nothing about this shared memory with &quot;b&quot;.  So the data memory for &quot;a&quot; is freed, and suddenly the &quot;b&quot; data pointer is pointing to invalid memory. Of course any access of this memory downstream could cause a crash.  And what happens when you clear &quot;b&quot;, either before or after &quot;a&quot; is cleared? The MATLAB memory manager does not have any memory block address for allocations that match the &quot;b&quot; data pointer, so when it tries to check for sharing or tries to free this memory the results will be undefined, again potentially resulting in a crash.&lt;br&gt;
&lt;br&gt;
You *can* get away with this behavior, but you have to be *very* careful to never do anything that would cause the original full data block that &quot;b&quot; is pointing to to be cleared before &quot;b&quot; is properly cleared, never do anything that would cause data sharing with &quot;b&quot; and another variable (e.g., assignment or reshape), and never clear &quot;b&quot; until you could manually detach its data pointer with another specialized mex routine. e.g., consider this mex routine called uninplacecolumn.c&lt;br&gt;
&lt;br&gt;
/* Here is my UNINPLACECOLUMN MEX function&lt;br&gt;
&lt;br&gt;
/*************************************************************************&lt;br&gt;
&amp;nbsp;* function uninplacecolumn(a)&lt;br&gt;
&amp;nbsp;* Detaches the data from an inplace column mxArray that was created&lt;br&gt;
&amp;nbsp;* with the inplacecolumn function.&lt;br&gt;
&amp;nbsp;************************************************************************/&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
#include &quot;matrix.h&quot;&lt;br&gt;
&lt;br&gt;
#define mwSize int&lt;br&gt;
&lt;br&gt;
/* Gateway of inplacecolumn */&lt;br&gt;
void mexFunction(int nlhs, mxArray *plhs[],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int nrhs, const mxArray *prhs[]) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mwSize k, N, M;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double *Pr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Check arguments */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nrhs!=1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;UNINPLACECOLUMN: One input argument required.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if( nlhs != 0 ) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;UNINPLACECOLUMN: Zero output arguments required.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetM(prhs[0], 0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetN(prhs[0], 0);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetPr(prhs[0], NULL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br&gt;
&lt;br&gt;
} /* Gateway of UNINPLACECOLUMN.c */ &lt;br&gt;
&lt;br&gt;
And then consider this sequence of MATLAB commands:&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; format debug&lt;br&gt;
&amp;gt;&amp;gt; a=rand(3,3)&lt;br&gt;
a =&lt;br&gt;
Structure address = 39cd9a0 &lt;br&gt;
m = 3 &lt;br&gt;
n = 3&lt;br&gt;
pr = 10181f60 &lt;br&gt;
pi = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9501    0.4860    0.4565&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.2311    0.8913    0.0185&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.6068    0.7621    0.8214&lt;br&gt;
&amp;gt;&amp;gt; b=inplacecolumn(a,2)&lt;br&gt;
b =&lt;br&gt;
Structure address = fe74120 &lt;br&gt;
m = 3 &lt;br&gt;
n = 1&lt;br&gt;
pr = 10181f78 &lt;br&gt;
pi = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.4860&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.8913&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.7621&lt;br&gt;
&amp;gt;&amp;gt; c=2*b&lt;br&gt;
c =&lt;br&gt;
Structure address = fe73560 &lt;br&gt;
m = 3 &lt;br&gt;
n = 1&lt;br&gt;
pr = fe643e0 &lt;br&gt;
pi = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9720&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.7826&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.5242&lt;br&gt;
&amp;gt;&amp;gt; uninplacecolumn(b)&lt;br&gt;
&amp;gt;&amp;gt; b&lt;br&gt;
b =&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[]&lt;br&gt;
&amp;gt;&amp;gt; clear b&lt;br&gt;
&amp;gt;&amp;gt; a&lt;br&gt;
a =&lt;br&gt;
Structure address = 39cd9a0 &lt;br&gt;
m = 3 &lt;br&gt;
n = 3&lt;br&gt;
pr = 10181f60 &lt;br&gt;
pi = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9501    0.4860    0.4565&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.2311    0.8913    0.0185&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.6068    0.7621    0.8214&lt;br&gt;
&amp;gt;&amp;gt; c&lt;br&gt;
c =&lt;br&gt;
Structure address = fe73560 &lt;br&gt;
m = 3 &lt;br&gt;
n = 1&lt;br&gt;
pr = fe643e0 &lt;br&gt;
pi = 0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.9720&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.7826&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1.5242&lt;br&gt;
&amp;gt;&amp;gt; clear all&lt;br&gt;
&amp;gt;&amp;gt; whos&lt;br&gt;
&lt;br&gt;
This all works because &lt;br&gt;
&lt;br&gt;
1) I didn't clear &quot;a&quot; before I cleared &quot;b&quot;&lt;br&gt;
2) I never used &quot;b&quot; in a way that caused data sharing with another variable&lt;br&gt;
3) I detached the data pointer for &quot;b&quot; before I cleared &quot;b&quot;&lt;br&gt;
&lt;br&gt;
James Tursa</description>
    </item>
    <item>
      <pubDate>Sat, 27 Jun 2009 21:13:01 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660956</link>
      <author>Bruno Luong</author>
      <description>&quot;James Tursa&quot; &amp;lt;aclassyguywithaknotac@hotmail.com&amp;gt; wrote in message &amp;lt;h25val$cna$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;h2540t$73d$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; I want to create an inplace column vector using MEX. The idea is to create a column array that has its data pointer points on the the data block of an existing (input) matrix. Everything going well until I set the data pointer. Then it crashes &lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; a=rand(1,7)&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; a =&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt;     0.8147    0.9058    0.1270    0.9134    0.6324    0.0975    0.2785&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; &amp;gt;&amp;gt; b=inplacecolumn(a,3)&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; Am I allowed to do such thing? If not what cause the crash?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; No. You cannot do this. The problem is what happens when variables get cleared. If &quot;a&quot; gets cleared, the MATLAB memory manager knows nothing about this shared memory with &quot;b&quot;.  So the data memory for &quot;a&quot; is freed, and suddenly the &quot;b&quot; data pointer is pointing to invalid memory. Of course any access of this memory downstream could cause a crash.  And what happens when you clear &quot;b&quot;, either before or after &quot;a&quot; is cleared? The MATLAB memory manager does not have any memory block address for allocations that match the &quot;b&quot; data pointer, so when it tries to check for sharing or tries to free this memory the results will be undefined, again potentially resulting in a crash.&lt;br&gt;
&amp;gt; &lt;br&gt;
&lt;br&gt;
Oh James, I don't worry about those clearing things, I can just right my own inplace CLEAR to undo the b, in the reverse sequences from how they are created (such like your uninplacecolumn).&lt;br&gt;
&lt;br&gt;
My problem is I cannot even create such in-place pointer in a newer Matlab version (can't tell which one). It works all right in older Matlab version, e.g., 2006B. Actually I was surprised by the example given in your post, and that's why I come back and run INPLACECOLUMN under 2006B and it works. So now this is the scope. What is going on with the newer Matlabn version to prevent me doing such thing?&lt;br&gt;
&lt;br&gt;
I feel I must explain why I want to do such thing. The reason is I want to avoid unnecessary data copy when call a function using a column of a matrix:&lt;br&gt;
&lt;br&gt;
a = rand(1000);&lt;br&gt;
for k=1:size(A,2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myfun(a(:,k)); &lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
This calling will make a copy the data a(:,k) into a new vector. So I want to avoid the copy and do&lt;br&gt;
&lt;br&gt;
a = rand(1000);&lt;br&gt;
for k=1:size(A,2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ak = inplacecolumn(a,k);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myfun(ak);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uninplacecolumn(ak);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear ak; &lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
But it seems this will not work with recent Matlab version. Now if someone knows something about the reason, I would love to hear!!!!&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Sat, 27 Jun 2009 21:42:01 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660958</link>
      <author>James Tursa</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;h2620t$162$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; My problem is I cannot even create such in-place pointer in a newer Matlab version (can't tell which one). It works all right in older Matlab version, e.g., 2006B. Actually I was surprised by the example given in your post, and that's why I come back and run INPLACECOLUMN under 2006B and it works. So now this is the scope. What is going on with the newer Matlabn version to prevent me doing such thing?&lt;br&gt;
&lt;br&gt;
Hmmm ... I can't answer that. The only thing I can think of is that they have changed the way their garbage collection works when the mex function returns and for some reason this results in corrupted memory in the newer version. You might try a couple of things:&lt;br&gt;
&lt;br&gt;
1) Inside a single mex routine:&lt;br&gt;
- Create an inplace column mxArray shared variable.&lt;br&gt;
- Use it in some way (e.g., call mexCallMATLAB to multiply it by 2)&lt;br&gt;
- Detach the data pointer and then call mxDestroyArray on it.&lt;br&gt;
&lt;br&gt;
2) Try something similar inside an engine application.&lt;br&gt;
&lt;br&gt;
If the above work, then it would point to the garbage collection as the culprit. But I don't really know how to verify this.&lt;br&gt;
&lt;br&gt;
James Tursa</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 08:07:27 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660997</link>
      <author>Bruno Luong</author>
      <description>&quot;James Tursa&quot; &amp;lt;aclassyguywithaknotac@hotmail.com&amp;gt; wrote in message &amp;lt;h263n9$ham$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;h2620t$162$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; &amp;gt; &lt;br&gt;
&amp;gt; &amp;gt; My problem is I cannot even create such in-place pointer in a newer Matlab version (can't tell which one). It works all right in older Matlab version, e.g., 2006B. Actually I was surprised by the example given in your post, and that's why I come back and run INPLACECOLUMN under 2006B and it works. So now this is the scope. What is going on with the newer Matlabn version to prevent me doing such thing?&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; Hmmm ... I can't answer that. The only thing I can think of is that they have changed the way their garbage collection works when the mex function returns and for some reason this results in corrupted memory in the newer version. You might try a couple of things:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; 1) Inside a single mex routine:&lt;br&gt;
&amp;gt; - Create an inplace column mxArray shared variable.&lt;br&gt;
&lt;br&gt;
James, I cannot even create an inplace shared variable, it crashes in the line mxSetPr. This occurs only on the recent Matlab version - I'm investigating from which version the problem arises. There is some internal mechanism that is not compatible with shared data. Quite annoying, because I can no longer optimize my code by using shared data.&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 08:24:01 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#660999</link>
      <author>Bruno Luong</author>
      <description>Below is part of the error message when it crashed. There is an internal check in libmwfl.dll and libmx.dll. Au revoir my freedom ;-(&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; a=rand(5)&lt;br&gt;
&lt;br&gt;
a =&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.7547    0.1190    0.2238    0.8909    0.2575&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.2760    0.4984    0.7513    0.9593    0.8407&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.6797    0.9597    0.2551    0.5472    0.2543&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.6551    0.3404    0.5060    0.1386    0.8143&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.1626    0.5853    0.6991    0.1493    0.2435&lt;br&gt;
&lt;br&gt;
&amp;gt;&amp;gt; b=inplacecolumn(a,2)&lt;br&gt;
&lt;br&gt;
ALIGNMENT ERROR:   [VRP/VPA] vector_check: pointer not allocated with vector_*alloc&lt;br&gt;
PID:               5912&lt;br&gt;
NATIVE ALIGNMENT:  8 (0x8)&lt;br&gt;
REQ ALIGNMENT:     16 (0x10)&lt;br&gt;
ALIGNED POINTER:   0C8C25F8&lt;br&gt;
REQ SIZE:          0 (0)&lt;br&gt;
HEADER ADDRESS:    0C8C25F0&lt;br&gt;
HEADER SIZE:       8 (0x8)&lt;br&gt;
HEADER DATA:       INACCESSIBLE&lt;br&gt;
&lt;br&gt;
[  0] 782FDBA0 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00121760 ( fl::diag::stacktrace_base::capture+000022 )&lt;br&gt;
[  1] 782FDE10 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00122384 ( fl::diag::stacktrace_base::stacktrace_base+000034 )&lt;br&gt;
[  2] 782FDE31 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00122417 ( fl::diag::stacktrace_base::stacktrace_base+000067 )&lt;br&gt;
[  3] 782FE79C C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00124828 ( fl::app::not_initialized_exception::not_initialized_exception+001477 )&lt;br&gt;
[  4] 782FE8B1 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00125105 ( fl::app::not_initialized_exception::not_initialized_exception+001754 )&lt;br&gt;
[  5] 782FEA16 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00125462 ( fl::app::not_initialized_exception::not_initialized_exception+002111 )&lt;br&gt;
[  6] 782E73D9 C:/Program Files/MATLAB/R2009a/bin/win32/libmwfl.dll+00029657 ( std::_Init_locks::operator=+015445 )&lt;br&gt;
[  7] 7B369E07 C:/Program Files/MATLAB/R2009a/bin/win32/libmx.dll+00105991 ( mxSetPr+000039 )&lt;br&gt;
[  8] 03C0114F C:/Users/Bruno/Documents/matlab/misc/MinMaxSelection/inplacecolumn.mexw32+00004431 ( mexFunction+000335 )&lt;br&gt;
...&lt;br&gt;
&lt;br&gt;
Bruno</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 09:01:01 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#661002</link>
      <author>James Tursa</author>
      <description>&quot;Bruno Luong&quot; &amp;lt;b.luong@fogale.findmycountry&amp;gt; wrote in message &amp;lt;h279b1$4q3$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Below is part of the error message when it crashed. There is an internal check in libmwfl.dll and libmx.dll. Au revoir my freedom ;-(&lt;br&gt;
&lt;br&gt;
OK. Maybe as a last resort you could try the following. Use the incomplete mxArray structure definition that Peter Boettcher has listed on a website (can't remember the website right now). You can find it in this thread:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.mathworks.com/matlabcentral/newsreader/view_thread/247881#639280&quot;&gt;http://www.mathworks.com/matlabcentral/newsreader/view_thread/247881#639280&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
Put that at the top of your mex file and then set the pdata pointer directly instead of using the mxSetPr function. That will bypass any checking that is going on with the mxSetPr call. I think that this will at least allow you to temporarily build the mxArray. Can't say what will happen once you try to use it or pass it back to MATLAB though.&lt;br&gt;
&lt;br&gt;
James Tursa</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 09:04:02 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#661003</link>
      <author>James Tursa</author>
      <description>Follow-up. Here are the sources I used:&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://groups.google.com/group/comp.soft-sys.matlab/browse_thread/thread/c241d8821fb90275/47189d498d1f45b8?lnk=st&amp;q=&amp;rnum=1&amp;hl=en#47189d498d1f45b8&quot;&gt;http://groups.google.com/group/comp.soft-sys.matlab/browse_thread/thread/c241d8821fb90275/47189d498d1f45b8?lnk=st&amp;q=&amp;rnum=1&amp;hl=en#47189d498d1f45b8&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
&lt;a href=&quot;http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays&quot;&gt;http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays&lt;/a&gt;&lt;br&gt;
&lt;br&gt;
James Tursa</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 10:02:02 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#661006</link>
      <author>Bruno Luong</author>
      <description>&quot;James Tursa&quot; &amp;lt;aclassyguywithaknotac@hotmail.com&amp;gt; wrote in message &amp;lt;h27bm1$1m4$1@fred.mathworks.com&amp;gt;...&lt;br&gt;
&amp;gt; Follow-up. Here are the sources I used:&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;a href=&quot;http://groups.google.com/group/comp.soft-sys.matlab/browse_thread/thread/c241d8821fb90275/47189d498d1f45b8?lnk=st&amp;q=&amp;rnum=1&amp;hl=en#47189d498d1f45b8&quot;&gt;http://groups.google.com/group/comp.soft-sys.matlab/browse_thread/thread/c241d8821fb90275/47189d498d1f45b8?lnk=st&amp;q=&amp;rnum=1&amp;hl=en#47189d498d1f45b8&lt;/a&gt;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; &lt;a href=&quot;http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays&quot;&gt;http://www.mk.tu-berlin.de/Members/Benjamin/mex_sharedArrays&lt;/a&gt;&lt;br&gt;
&amp;gt; &lt;br&gt;
&amp;gt; James Tursa&lt;br&gt;
&lt;br&gt;
Now that's an idea! I have tried and it works. There is a change of mxArray definition since posted by Peter and in the current version. Ideally, we should be able to adapt the definition by looking through the header MATRIX.H&lt;br&gt;
&lt;br&gt;
Here is my code, and it works now.&lt;br&gt;
&lt;br&gt;
Bruno&lt;br&gt;
&lt;br&gt;
/*************************************************************************&lt;br&gt;
&amp;nbsp;* function B = inplacecolumn(A, k)&lt;br&gt;
&amp;nbsp;* Return the inplace-column A(:,k)&lt;br&gt;
&amp;nbsp;* Important notes: &lt;br&gt;
&amp;nbsp;* - use MEX function releaseinplace(B) to release properly shared-data&lt;br&gt;
&amp;nbsp;*   pointer before clear/reuse B.&lt;br&gt;
&amp;nbsp;* - All inplace variables shared data with A must be released before&lt;br&gt;
&amp;nbsp;*   the original array A is cleared/reused.&lt;br&gt;
&amp;nbsp;************************************************************************/&lt;br&gt;
#include &quot;mex.h&quot;&lt;br&gt;
#include &quot;matrix.h&quot;&lt;br&gt;
&lt;br&gt;
/* Internal representation of mxArray, inspired from mxArray_tag declared&lt;br&gt;
&amp;nbsp;* in the header &amp;lt;matrix.h&amp;gt;. Todo: build automatically source code for&lt;br&gt;
&amp;nbsp;* Internal_mxArray */&lt;br&gt;
typedef struct {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void    *reserved;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int      reserved1[2];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void    *reserved2;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t  number_of_dims;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int reserved3;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag0 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag1 : 1; &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag2 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag3 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag4 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag5 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag6 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag7 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag7a: 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag8 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag9 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag10 : 1;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag11 : 4;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag12 : 8;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int    flag13 : 8;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}   flags;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t reserved4[2];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;union {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void  *pdata;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void  *pimag_data;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void  *reserved5;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t reserved6[3];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}   number_array;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}   data;&lt;br&gt;
} Internal_mxArray;&lt;br&gt;
&lt;br&gt;
/* Gateway of inplacecolumn */&lt;br&gt;
void mexFunction(int nlhs, mxArray *plhs[],&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int nrhs, const mxArray *prhs[]) {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mwSize k, N, M;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double *Pr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Check arguments */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (nrhs!=2)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Two input arguments required.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!mxIsNumeric(prhs[0]))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: First input A argument must be numeric.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!mxIsNumeric(prhs[1]))                              &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be numeric.&quot;);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Get the size */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;M = mxGetM(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N = mxGetN(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Get the column number k from the second input */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mxGetM(prhs[1])!=1 || mxGetN(prhs[1])!=1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be a scalar.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (mxGetClassID(prhs[1]) != mxDOUBLE_CLASS)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: Second input K must be a double.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = (mwSize)(*mxGetPr(prhs[1]));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Make sure k is valid */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (k&amp;lt;1 || k&amp;gt;N)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mexErrMsgTxt(&quot;INPLACECOLUMN: K is not valid.&quot;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Create the Matrix result (first output) */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plhs[0] = mxCreateNumericMatrix(0, 0, mxDOUBLE_CLASS, mxREAL);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pr = mxGetPr(plhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxFree(Pr); /* Free the data, normally Pr is NULL and this does&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* nothing */&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Set the dimension as one column */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetM(plhs[0], M);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mxSetN(plhs[0], 1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Inplace data pointer of A */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pr = mxGetPr(prhs[0]);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pr += (k-1)*M; /* Point to the column #k */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Equivalent to doing this: mxSetPr(plhs[0], Pr); &lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;but access directly to data pointer in order to by pass Matlab&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;checking */&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;((Internal_mxArray*)(plhs[0]))-&amp;gt;data.number_array.pdata = Pr;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br&gt;
&lt;br&gt;
} /* Gateway of INPLACECOLUMN.c */</description>
    </item>
    <item>
      <pubDate>Sun, 28 Jun 2009 12:43:00 -0400</pubDate>
      <title>Re: Inplace array (mex)</title>
      <link>http://www.mathworks.com/matlabcentral/newsreader/view_thread/254813#661029</link>
      <author>Bruno Luong</author>
      <description>I'm working through a function that provides the automatically C-structure definition of the mxArray. As it might have some interests (no longer worry about set up the code wrp to Matlab version), I post the code here:&lt;br&gt;
&lt;br&gt;
function content = buildInternal_mxArrayDef(mxArraydefFilename)&lt;br&gt;
% function content = buildInternal_mxArrayDef(mxArraydefFilename)&lt;br&gt;
%&lt;br&gt;
% Building the typedef of internal structure MxArray by looking inside&lt;br&gt;
% the header file include file MATRIX.H. This ensure the definition used&lt;br&gt;
% is compatible with the Matlab version&lt;br&gt;
% The internal definition will be used by MEX file inplacecolumn and&lt;br&gt;
% releaseinplace&lt;br&gt;
%&lt;br&gt;
% EXAMPLE USAGE:&lt;br&gt;
%   buildInternal_mxArrayDef('Internal_mxArray.h')&lt;br&gt;
%&lt;br&gt;
% Author: Bruno Luong &amp;lt;brunoluong@yahoo.com&amp;gt;&lt;br&gt;
%&lt;br&gt;
% History&lt;br&gt;
%   Original: 28-Jun-2009&lt;br&gt;
&lt;br&gt;
% Location of the header file matrix.h&lt;br&gt;
MLincludepath = [matlabroot() filesep 'extern' filesep 'include'];&lt;br&gt;
matrixhfile = 'matrix.h';&lt;br&gt;
&lt;br&gt;
fid = fopen([MLincludepath filesep matrixhfile]);&lt;br&gt;
if fid&amp;gt;0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = textscan(fid, '%s', 'Delimiter', '\n', 'Whitespace', '');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(fid);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content = c{1};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Look for the line containing &quot;struct mxArray_tag {&quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;idxmxArray_tag = strfind(content,'struct mxArray_tag {');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l1 = find(~cellfun('isempty',idxmxArray_tag),1,'first');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if isempty(l1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Cannot parse matrix.h file');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Modify the mxArray_tag to typedef definition&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content{l1} = strrep(content{l1}, ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'struct mxArray_tag', 'typedef struct');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Loop on the line and stop when the last curly bracket after&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% find the corresponding closed curly bracket&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% &quot;struct mxArray_tag { ... }&quot;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l9 = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ncurlybrackets = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nlevels = 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for l=l1:length(content)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line  = content{l};&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nopen = sum(line=='{');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nclose = sum(line=='}');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ncurlybrackets =  ncurlybrackets + (nopen + nclose);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nlevels = nlevels + (nopen - nclose);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ncurlybrackets&amp;gt;0 &amp;&amp; nlevels==0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;l9 = l;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Modify the last line with the typedef name 'Internal_mxArray'&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastcurly = find(line=='}',1,'last');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line = [line(1:lastcurly) ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;' Internal_mxArray' ...&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;line(lastcurly+1:end)];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content{l} = line;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if l9==0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Cannot parse matrix.h file');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Here is the definition we are interested in&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content = content(l1:l9);    &lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if nargin&amp;gt;=1&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;thisfile = mfilename();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fid = fopen(mxArraydefFilename,'wt');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Write a comment header&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fid, ['/* Built automatically by ' thisfile '.m\n']);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fid, ['\tBuilt date: ' datestr(now) '\n']);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fid, ['\tMatlab version: ' version('-release') '\n']);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fid, '*/\n\n');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if fid&amp;gt;0&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;% Write the content to header file&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for l=1:length(content)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fid, '%s\n', content{l});&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(fid);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Cannot write the header file %s', mxArraydefFilename);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end&lt;br&gt;
else % fail to open matrix.h&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;error('Cannot find ML &amp;lt;matrix.h&amp;gt; file');&lt;br&gt;
end&lt;br&gt;
&lt;br&gt;
% Bruno</description>
    </item>
  </channel>
</rss>

