C++ 将向量传递给函数并返回该向量并进行重铸
我使用MEX将我的C++代码与MATLAB进行接口。我的C++代码需要输出类型向量。因为我是C++新手,所以我很难理解指针是如何工作的。我将从MATLAB中获取一个输入数组C++ 将向量传递给函数并返回该向量并进行重铸,c++,matlab,pointers,vector,mex,C++,Matlab,Pointers,Vector,Mex,我使用MEX将我的C++代码与MATLAB进行接口。我的C++代码需要输出类型向量。因为我是C++新手,所以我很难理解指针是如何工作的。我将从MATLAB中获取一个输入数组 int *data_array_ptr data_array_ptr=(int *)mxGetData(prhs[0]); a = mxGetM(prhs[0]); int int_data[a]; copy(*data_array_ptr, *data_array_ptr+ a, int_data); 现在,int_da
int *data_array_ptr
data_array_ptr=(int *)mxGetData(prhs[0]);
a = mxGetM(prhs[0]);
int int_data[a];
copy(*data_array_ptr, *data_array_ptr+ a, int_data);
现在,int_data应该拥有存储在data_array_ptr位置的所有数据。。。它能做到这一点吗
那么
double *data_out_ptr;
plhs[0]= mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL);
data_out_ptr= mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
vector<double> data_out_data(*data_out_ptr,*data_out_ptr+len6);
double*数据输出\u ptr;
plhs[0]=mxCreateDoubleMatrix((mwSize)m,(mwSize)n,mxREAL);
数据输出ptr=mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
矢量数据输出数据(*数据输出ptr,*数据输出ptr+len6);
这应该将空输出矩阵的内容放入名为data\u out\u data的向量中。它能做到这一点吗
然后,我想把DATAXOUTXODATA和ITENDATA数据传递给C++函数。但是,我想把DATAXOUTIOL数据作为指针传递,这样C++函数将用数据填充向量,然后当函数完成时,MEX函数将看到现在填充的向量,并且能够将它转换成可以填充PLHs的双倍数组[0 ]。p> 比如
mexFunction(plhs[],prhs[]){
int *data_array_ptr
data_array_ptr=(int *)mxGetData(prhs[0]);
a = mxGetM(prhs[0]);
int int_data[a];
copy(*data_array_ptr, *data_array_ptr+ a, int_data);
double *data_out_ptr;
plhs[0]= mxCreateDoubleMatrix( (mwSize)m, (mwSize)n, mxREAL);
data_out_ptr= mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
vector<double> data_out_data(*data_out_ptr,*data_out_ptr+len6);
foo(int_data, *data_out_data)
copy(data_out_data.begin(), data_out_data.end(), data_out_ptr);
}
MEX功能(plhs[],prhs[]{
int*数据数组ptr
数据数组ptr=(int*)mxGetData(prhs[0]);
a=mxGetM(prhs[0]);
int_数据[a];
复制(*数据数组ptr,*数据数组ptr+a,整数数据);
双*数据输出ptr;
plhs[0]=mxCreateDoubleMatrix((mwSize)m,(mwSize)n,mxREAL);
数据输出ptr=mxGetPr(plhs[0]);
len6=mxGetM(plhs[0]);
矢量数据输出数据(*数据输出ptr,*数据输出ptr+len6);
foo(输入数据,*数据输出数据)
复制(数据输出数据.begin()、数据输出数据.end()、数据输出ptr);
}
在返回foo时,将填写数据。我的函数没有返回参数数据必须是vector类型。如何将向量传递给foo,以便foo可以编辑数据
谢谢 您取消对指针的引用的次数超出了应有的范围
int *data_array_ptr;
// ...
copy(*data_array_ptr, *data_array_ptr+ a, int_data);
当要求您提供指向copy
的开始和结束指针时,您需要执行以下操作:
copy(data_array_ptr, data_array_ptr+ a, int_data);
现在您已经提供了两个内存地址。第一个,data\u array\u ptr
,是数组开头的地址。第二个,data\u array\u ptr+a
是数组末尾之后的元素地址
如果取消引用指针(*data\u array\u ptr
),则需要数组第一个元素的值(anint
)。同样,*data\u array\ptr+a
将首先获取第一个数组元素的值,然后将a
添加到该元素中。这不是你想要的
因此,按照建议将所有调用更改为copy
,以及vector
构造函数
关于你的foo
函数,如果你需要传递一个向量,那么就这样声明它:
void foo( int * int_data, std::vector<double> & data_out_data )
// ...
int int_data[a];
copy(*data_array_ptr, *data_array_ptr+ a, int_data);
// ...
vector<double> data_out_data(data_out_ptr, data_out_ptr+len6);
// ...
foo( int_data, data_out_data );
我不确定我是否正确理解了你的问题。我相信你想把一个数组从Matlab传递到你的MEX函数,然后MEX函数调用一个C++函数,这个函数在这个数据数组上运行,一个<代码>向量< /代码>。<代码>向量< /代码>包含C++函数所做的结果,并且希望将这些数据传递回Matlab。< /P>
plhs[0] = mxCreateDoubleMatrix( m, n, mxReal );
std::copy( data_out.data(), data_out.data() + data_out.size(), mxGetPr(plhs[0]) );
首先,让我们来处理从MATLAB获取数据到MEX函数的问题
int const *data_in = static_cast<int const *>(mxGetData(prhs[0]));
你可以称之为
foo( data_in, mxGetNumberOfElements(prhs[0]), &data_out );
foo( data_in_vec.data(), data_out );
如果确实需要修改数据,和/或无法修改foo
,只需创建一个向量来保存数据的副本
std::vector<int> data_in_vec( data_in, data_in + mxGetNumberOfElements(prhs[0]) );
foo( data_in_vec.data(), data_out );
如果可能,修改foo
以接受std::vector&
而不是std::vector*
。那么你可以称之为
foo( data_in, mxGetNumberOfElements(prhs[0]), &data_out );
foo( data_in_vec.data(), data_out );
另外,如果有选择的话,我会根据需要调整向量的大小,而不是要求调用者这样做
现在,将数据返回到MATLAB
plhs[0] = mxCreateDoubleMatrix( m, n, mxReal );
std::copy( data_out.data(), data_out.data() + data_out.size(), mxGetPr(plhs[0]) );
上行假设向量的大小不大于m*n
<>记住,Matlab以列主格式存储矩阵,不像C+C++。根据
foo
函数的工作方式,您可能必须转置返回的向量,在这种情况下,您不能使用std::copy
进行复制,您必须编写嵌套循环。不要取消引用copy
中的指针,或者vector
@Aesthete a的构造函数参数设置为输入数组的大小,而m和n是输出数组的大小,比如说Matlab中的m=1和n=4,数组的大小已经正确,因此这不是问题,我还有其他类,它们在foo内部调用,将填充data_out向量中的数据。这些类已经被编写,并且只接受向量,我希望可能会将一个指针传递到foo中,以获取向量数据,然后用空向量调用这些类,然后在类填充数据之后,指针现在可以看到新的数据,因此我的MEX函数也可以看到新的数据。@user1586097您不能将向量传回MATLAB,也不能使由mxCreateDoubleMatrix
创建的向量和矩阵共享同一个数据缓冲区。在foo
完成对向量的操作后,您必须将向量的内容复制回plhs[0]
中的矩阵中。如果我像您所说的那样调用foo:如果可能,修改foo以接受std::vector&而不是std::vector*。然后您可以将其称为foo(data\u in\u vec.data(),data\u out)
如果我要将data\u传递给另一个类,它是数据向量的第一个元素的地址还是实际数据?我的类需要一个实际的向量。但我也希望在MEX中返回foo时可以看到类编辑的向量。@user1586097解释指针和引用之间的区别。引用引用原始变量,因此可以使用原始变量对其执行任何操作。另外,如果您对引用进行修改,它也会修改原始变量(因为它们都是相同的),谢谢。现在我的问题是copy(data\u array\u ptr,data