- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经为 MATLAB 编写了一个 mex 文件。它调用 MATLAB pinv
函数来计算 Moore Penrose 伪逆。我将此函数命名为 my_pinv
。 my_pinv
获取一个数组并返回其伪逆,与 pinv
完全相似:
A = magic(8); A = A(:,1:6)
b = 260*ones(8,1)
x = my_pinv(A)*b
但是,在 mex 文件中,我必须复制输入数组的值才能使用 mexCallMATLAB
。以下是 my_pinv.cpp
的内容:
#include <matrix.h>
#include <mex.h>
#include <string.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#define PRHS_A prhs[0]
#define PLHS_X plhs[0]
int M = mxGetM( PRHS_A ); // Get the dimensions of A.
int N = mxGetN( PRHS_A );
double *A_ptr = mxGetPr( PRHS_A );
mxArray *PINV_A = mxCreateDoubleMatrix(M, N, mxREAL); /* Put input in an mxArray */
memcpy(mxGetPr(PINV_A), A_ptr, sizeof(double)*M*N);
PLHS_X = mxCreateDoubleMatrix(N, M, mxREAL); // Create the output matrix.
mexCallMATLAB(1, &PLHS_X, 1, &PINV_A, "pinv");
}
在 mexCallMATLAB
中,我是否可以跳过使用 memcpy
并直接使用输入数组 prhs[0]
?我实际上不喜欢需要复制输入数组的值这一事实,尤其是当输入数组非常大时。
事实上,我希望能够使用像
这样的东西mexCallMATLAB(1, &PLHS_X, 1, &RHS_A, "pinv"); // (I know it is not right and the compiler would not like it but it is for the sake of example)
而不是
mexCallMATLAB(1, &PLHS_X, 1, &PINV_A, "pinv");
有人可以分享他/她在这方面的经验吗?
最佳答案
mexCallMATLAB
具有以下签名:
int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs,
mxArray *prhs[], const char *functionName);
由于某些原因,RHS 数组没有用 const
限定符标记。我不知道为什么...这解释了为什么会出现编译错误:
// this is from Visual C++ 2013
error C2664: 'int mexCallMATLAB(int,mxArray*[],int,mxArray *[],const char *)' :
cannot convert argument 4 from 'const mxArray *[]' to 'mxArray *[]'
Conversion loses qualifiers
解决方案是显式地放弃常量性,告诉编译器我们知道我们在做什么:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
// validate arguments
if(nrhs != 1 || nlhs > 1)
mexErrMsgIdAndTxt("mex:error", "Wrong number of arguments.");
//perhaps do more validations here..
// out = pinv(in)
mexCallMATLAB(1, plhs, 1, const_cast<mxArray**>(prhs), "pinv");
}
现在在 MATLAB 中:
>> x = rand(4,3);
>> my_pinv(x) - pinv(x)
ans =
0 0 0 0
0 0 0 0
0 0 0 0
如果出于某种原因并且在某些极端情况下这被证明是有问题的(我对此表示怀疑),则更安全的方法是使用以下方法复制数组:
mxArray *in = mxDuplicateArray(prhs[0]);
mexCallMATLAB(1, plhs, 1, &in, "pinv");
mxDestroyArray(in);
如果你绝对想避免创建深拷贝,有 undocumented functions创建一个共享数据副本(其中只创建一个新的数组头,但数据是共享的)。
关于arrays - 使用 mexCallMATLAB 时避免复制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26619947/
我正尝试在 mex 中开发一个函数。该功能的目的应该是将窗口滑动到 3D 图像上并在窗口内应用一些功能。目前我被卡住了,因为当算法到达 padarray 函数的调用时,MATLAB 崩溃了。 到目前为
我花了一个星期的时间来解决以下问题,但我终其一生都无法解决!我将尽可能简短地编写代码并删除不相关的行,但我的问题应该很清楚。对于初学者,我将 Matlab 与 C 结合使用,后者通过 mex 文件进行
我已经为 MATLAB 编写了一个 mex 文件。它调用 MATLAB pinv 函数来计算 Moore Penrose 伪逆。我将此函数命名为 my_pinv。 my_pinv 获取一个数组并返回其
我目前正在用 C 语言编写一个 MEX 文件,以加速严重依赖函数句柄的 MATLAB 代码。不幸的是,我的 MEX 文件运行速度比应有的速度慢,因为我必须使用 mexCallMATLAB 来计算 MA
执行提示错误的代码是: void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { double
为了减少运行时间,我开始用 C++ 实现一些 m 文件。 m 文件生成 n 维点并计算这些点处的函数值。这些函数是用户定义的,它们作为函数句柄传递给 m 文件和 mex 文件。 mex 文件使用带有
我是一名优秀的程序员,十分优秀!