dzh*_*lil 6 c++ matlab vector ublas
我正在使用C++ ublas库编写一个Matlab扩展,我希望能够从Matlab插件传递的C数组中初始化我的ublas向量.如何在没有(为了提高效率)显式复制数据的情况下从C数组初始化ublas向量.我正在寻找以下代码行:
using namespace boost::numeric::ublas;
int pv[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
vector<int> v (pv);
Run Code Online (Sandbox Code Playgroud)
通常,是否可以std::vector
从数组初始化C++ ?像这样的东西:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int pv[4] = { 4, 4, 4, 4};
vector<int> v (pv, pv+4);
pv[0] = 0;
cout << "v[0]=" << v[0] << " " << "pv[0]=" << pv[0] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但初始化不会复制数据.在这种情况下输出是
v[0]=4 pv[0]=0
Run Code Online (Sandbox Code Playgroud)
但我希望输出相同,更新C数组会更改C++向量指向的数据
v[0]=0 pv[0]=0
Run Code Online (Sandbox Code Playgroud)
我不确定你的问题与MATLAB/MEX有什么关系,但是请注意,你可能想知道MATLAB实现了写时复制策略.
这意味着当您复制数组时,实际上只复制了一些标题,而数据本身在两个数组之间共享.一旦修改了其中一个,就会实际制作一份数据.
以下是对引擎盖下可能发生的事情的一种模拟(借用这篇旧帖子):
-----------------------------------------
>> a = [35.7 100.2 1.2e7];
mxArray a
pdata -----> 35.7 100.2 1.2e7
crosslink=0
-----------------------------------------
>> b = a;
mxArray a
pdata -----> 35.7 100.2 1.2e7
crosslink / \
| / \ |
| | |
| | |
\ / | |
crosslink |
mxArray b |
pdata --------
-----------------------------------------
>> a(1) = 1;
mxArray a
pdata -----> (1) 100.2 1.2e7
crosslink=0
crosslink=0
mxArray b
pdata ------> 35.7 100.2 1.2e7 ...
Run Code Online (Sandbox Code Playgroud)
我知道这并没有真正回答你的问题,我只是觉得你会发现这个概念很有用.
这两个std::vector
和ublas::vector
是容器.容器的重点是管理其包含对象的存储和生命周期.这就是为什么在初始化它们时,它们必须将值复制到它们拥有的存储中.
C数组是大小和位置固定的内存区域,因此根据其性质,您只能通过复制将它们的值放入容器中.
您可以使用C数组作为许多算法函数的输入,所以也许您可以这样做以避免初始复制?