gpt4 book ai didi

c++ - 将变量(float *)保存到 plhs

转载 作者:行者123 更新时间:2023-11-28 00:26:09 25 4
gpt4 key购买 nike

我有一个代码。但我不知道如何保存输出(点*)。那就是我尝试将 float * out 保存到 plhs。打印出来的结果是对的。没有找到合适的例子,有没有可用的例子。

感谢您的回答。我没有任何错误。但是打印出来的结果是对的。但在 Matlab 中,输出全为零。

我初始化out都是零。但是在我调用 pointwise_search 之后,out 没有任何变化。

如果我使用 out = pointwise_search(q,p,num_thres,x,len) 问题就解决了。

 #include "mex.h"
#include "matrix.h"
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

using namespace std;


void pointwise_search(double *p,double *q,int num_thres, double* n, int len, double * out )
{
vector<double> P(p, p + num_thres);
vector<double> Q(q, q + num_thres);
int size_of_threshold = P.size();
double * Y;
double *z=new double[len];
typedef vector<double > ::iterator IntVectorIt ;
IntVectorIt start, end, it, location ;
start = P.begin() ; // location of first
// element of Numbers

end = P.end() ; // one past the location
// last element of Numbers

for (int i=0;i<len;i++)
{
location=lower_bound(start, end, n[i]) ;
z[i]=location - start;
if(z[i]>0&&z[i]<=size_of_threshold-1)
{

out[i]=(n[i]-P[z[i]])/(P[z[i]-1]-P[z[i]])*(Q[z[i]-1]-Q[z[i]])+Q[z[i]];
}
else if (z[i]>size_of_threshold-1)
{
out[i]=Q[z[i]-1];
}
else
{
out[i]=Q[z[i]];
}
}

delete []z;

}


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double * out;

double *n = (double*) mxGetData(prhs[3]);
int len = (int) mxGetScalar(prhs[4]);
int num_thres = (int) mxGetScalar(prhs[2]);
mexPrintf("len=%d\n ",len);
mexPrintf("num_thres=%d\n ",num_thres);


double * Numbers= (double *)mxGetData(prhs[0]);
double * Q= (double *)mxGetData(prhs[1]);
mexPrintf("Q[4]=%f\n ",Q[4]);

plhs[0] = mxCreateNumericMatrix(len, 1,mxSINGLE_CLASS, mxREAL); /* Create the output matrix */
out = (double *)mxGetPr(plhs[0]);
pointwise_search(Numbers,Q,num_thres,n,len,out );
mexPrintf("out[4]=%f\n ",out[0]);
mexPrintf("out[4]=%f\n ",out[1]);
mexPrintf("out[4]=%f\n ",out[2]);



}

最佳答案

你不应该分配 out直接值。

检查一下(C 代码应该足够了):

首先,您使用不同的变量和类型映射 MEX 函数接口(interface)内存。

然后,您将它们全部传递给实际的 C 函数。

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{
int num;
float *A;
double *out;
//mxLogical, etc

/* Extract the inputs */
num = (int)mxGetScalar(prhs[0]);
A = (float *)mxGetData(prhs[1]);
// You can get sizes of A with mxGetM/mxGetN functions

/* Setup the output */
// It's 1x1 matrix of doubles here.
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
out = mxGetPr(plhs[0]);

/* Do the actual work */
// If you need to iterate over A, pass M,N values here also
your_function(num, A, out);
}

最后,C 函数应该设置 out指针值。

// And declare M,N here as inputs
void your_function(const int num, const float* A, double *out)
{
//Some code. Operate with `num`, `A`, etc
*out = DBL_MAX;
}

哦,为 double 写了这个.对于 float和其他类型使用 mxCreateNumericMatrix(1, 1, mxSINGLE_CLASS, mxREAL)而不是 mxCreateDoubleMatrix(1, 1, mxREAL) .

这里还有一个link to check .

关于c++ - 将变量(float *)保存到 plhs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24931805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com