从C数组初始化ublas向量

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)

Amr*_*mro 8

我不确定你的问题与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)

我知道这并没有真正回答你的问题,我只是觉得你会发现这个概念很有用.

  • 您可以使用`format debug`在MATLAB命令窗口设置格式中查看此元数据 (11认同)

CB *_*ley 6

这两个std::vectorublas::vector是容器.容器的重点是管理其包含对象的存储和生命周期.这就是为什么在初始化它们时,它们必须将值复制到它们拥有的存储中.

C数组是大小和位置固定的内存区域,因此根据其性质,您只能通过复制将它们的值放入容器中.

您可以使用C数组作为许多算法函数的输入,所以也许您可以这样做以避免初始复制?

  • 除了*理论上*你可以创建一个ublas :: vector的子类来做到这一点.您的子类可以表现为const ublas :: vector,它永远不会被调整大小,或者您必须覆盖调整容器大小所涉及的所有方法,以确保不释放不属于它的内存.只有完整的受虐狂会尝试这一点. (2认同)