簡體   English   中英

在mex中調用memcpy函數

[英]memcpy function calling inside mex

我有一個有趣的問題。 就是這樣; 我試圖在mex函數中使用std :: memcpy函數,並在MATLAB中調用那個mex函數;

I2 = b_filter(I);

當我復制整個圖像時,效果很好;

plhs[0] =  mxCreateDoubleMatrix(mxGetM(plhs[0]), mxGetN(plhs[0]), mxREAL);          
memcpy(mxGetPr(plhs[0]), mxGetPr(prhs[0]), sizeof(double) *mxGetM(plhs[0]) * mxGetN(plhs[0]));

但是當我試圖復制圖像的某些部分時

plhs[0] =  mxCreateDoubleMatrix(100, 100, mxREAL);              
memcpy(mxGetPr(plhs[0]), mxGetPr(prhs[0]), sizeof(double) * 100 * 100);

它沒有給出正確的圖像部分,但卻給出了無意義的像素值。

那么這里發生了什么?

哈哈! 你被一個最糟糕的mex文件細微差別抓住了! 它之前也有我。 mex函數中的數組按列順序而不是行順序存儲,因此您:

不過,您仍然可以像在Matlab中一樣使用列優先索引

博客網址

嘗試這個頁面也可以獲得一個很好的訂購圖片。

圖來自Mathworks

最后,我建議閱讀這個帖子 ,以便更好地了解C和MATLAB矩陣存儲器的差異,這些差異是按列排序的。

正如@macduff所解釋的,MATLAB使用列主要順序來存儲數組,而C數組是行主要的。

這是一個示例實現,展示了如何復制矩陣的一部分。

matrix_slice_mex.c

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    double *in, *out;
    mwIndex i,j;
    mwSize numRows;

    /* input checks */
    if (nrhs != 1 || nlhs > 1) {
        mexErrMsgIdAndTxt("MATLAB:nargchk", "Wrong number of arguments.");
    }
    if (mxGetNumberOfDimensions(prhs[0])>2 || !mxIsDouble(prhs[0])) {
        mexErrMsgIdAndTxt("MATLAB:wrongDims", "Expecting 2D double matrix.");
    }
    if (mxGetM(prhs[0])<100 || mxGetN(prhs[0])<100) {
        mexErrMsgIdAndTxt("MATLAB:wrongDims", "Matrix size must be >= 100x100.");
    }

    /* extract sub-matrix */
    plhs[0] = mxCreateDoubleMatrix(100, 100, mxREAL);
    out = mxGetPr(plhs[0]);
    in = mxGetPr(prhs[0]);
    numRows = mxGetM(prhs[0]);
    for(j=0; j<100; j++) {
        for(i=0; i<100; i++) {
            *out++ = in[i + numRows*j];
        }
    }
}

並測試這個:

x = rand(1000);
y = x(1:100,1:100);
yy = matrix_slice_mex(x);
isequal(y,yy)

您也可以使用memcpy復制每個列(一個用於循環)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM