Matlab Mex 文件 - 创建一个常量数组

Posted

技术标签:

【中文标题】Matlab Mex 文件 - 创建一个常量数组【英文标题】:Matlab Mex File - Creating a constant array 【发布时间】:2012-05-25 00:03:12 【问题描述】:

我正在尝试创建一个 C mex 文件,它将输入 Nx1 矩阵乘以一个常数 Nx1 矩阵。我想创建一个矩阵并为其分配对于 mex 函数的每次调用始终相同的值。我一直在看教程,但我能找到的只是人们创建矩阵并将它们与输入或输出联系起来。我的矩阵应该完全独立于此。

我正在尝试做的伪代码:

mxArray *input, *constant_matrix, *output;
input = mxDuplicateArray(prhs[0]);
constant_matrix = [10 15 20 73];            //<---- this is what I can't do.
for i = 1 to 4
    output += input[i]*constant_matrix[i];
return output;

提前谢谢你!

【问题讨论】:

【参考方案1】:

如果你想在堆栈上创建它,就这样做

const double constant_matrix[]=10,15,20,73;

..或者如果矩阵有点大,或者你在编译时不知道它的大小,你想要堆分配。在 mex 文件中使用...

double* constant_matrix = (double*)mxCalloc(n, sizeof(double));

..然后在循环中填充它(其中 n 是元素的数量)。如果您使用第二种方法,请不要忘记释放动态分配的内存。

【讨论】:

啊,有道理。所有这些特定于 matlab 的额外函数和数据类型都让我很困惑。谢谢!!【参考方案2】:

如果你还在寻找,这里有一个简单的实现(没有参数检查):

example.cpp

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    plhs[0] = mxDuplicateArray(prhs[0]);
    const double myArray[4] = 10,15,20,73;
    double *in = mxGetPr(prhs[0]), *out = mxGetPr(plhs[0]);
    for(int i=0; i<4; i++) 
        out[i] += in[i]*myArray[i];
    

编译后,我们可以测试它:

>> example(1:10)
ans =
    11    32    63   296     5     6     7     8     9    10

【讨论】:

以上是关于Matlab Mex 文件 - 创建一个常量数组的主要内容,如果未能解决你的问题,请参考以下文章

读取 MEX 文件中的 4D 数组

从 std::vector 在 MEX C++ 中创建 MATLAB 数组

编写 Mex 文件时出现错误消息,函数的数组输出有问题吗?

.mex 文件 matlab。 Libsvm 错误

Matlab MEX-函数副作用

mex 文件未在 MATLAB 7.5.0 (R2007b) 中执行