Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将向量传递给函数并返回该向量并进行重铸_C++_Matlab_Pointers_Vector_Mex - Fatal编程技术网

C++ 将向量传递给函数并返回该向量并进行重铸

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

我使用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_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
),则需要数组第一个元素的值(an
int
)。同样,
*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