从 std::vector 在 MEX C++ 中创建 MATLAB 数组
Create MATLAB Array in MEX C++ from a std::vector
我想知道是否有比我在下面所做和写的更优雅的方法从 std::vector
创建 MATLAB 数组。
我在下面的Matlab论坛的一个问题中找到了一个更简单的实现,但问题仍然存在。 MathWorks: Copying std::vector contents to TypedArray
我根据 matlab::data::SparseArray
的制作方式 (C++ class to create arrays) 使用了缓冲区。
免责声明:我真的很陌生!
假设我们有一个 V
双精度向量:
matlab::data::ArrayFactory f;
// these objects are std::unique_ptr<T[],matlab::data::buffer_deleter_t>
auto V_b_ptr = f.createBuffer<double>(V.size());
// this pointer points to the first adress that the std::unique_ptr points to
double* V_ptr = V_b_ptr.get();
// fill the buffer with the V values
std::for_each(V.begin(), V.end(), [&](const double& e) {*(V_ptr++) = e;} );
// finally create Matlab array from buffer
matlab::data::TypedArray<double> A = f.createArrayFromBuffer<double>({1, V.size()}, std::move(V_b_ptr));
在第二个 link 中,似乎有一种方法可以使用 factory.createArray(...)
来填充给定的数据。但是我无法让它工作。
我在尝试自己解决问题数小时后写下了这个问题。但在提交之前,我又给了它一个小时。我终于设法做到了。我在这里发布解决方案以防它对任何人有帮助。
如问题中的示例所示,假设我们有 std::vector
个双打 V
。
matlab::data::ArrayFactory f;
matlab::data::TypedArray<double> A = f.createArray<double>({1, V.size()}, V.data(), V.data()+V.size());
我想知道是否有比我在下面所做和写的更优雅的方法从 std::vector
创建 MATLAB 数组。
我在下面的Matlab论坛的一个问题中找到了一个更简单的实现,但问题仍然存在。 MathWorks: Copying std::vector contents to TypedArray
我根据 matlab::data::SparseArray
的制作方式 (C++ class to create arrays) 使用了缓冲区。
免责声明:我真的很陌生!
假设我们有一个 V
双精度向量:
matlab::data::ArrayFactory f;
// these objects are std::unique_ptr<T[],matlab::data::buffer_deleter_t>
auto V_b_ptr = f.createBuffer<double>(V.size());
// this pointer points to the first adress that the std::unique_ptr points to
double* V_ptr = V_b_ptr.get();
// fill the buffer with the V values
std::for_each(V.begin(), V.end(), [&](const double& e) {*(V_ptr++) = e;} );
// finally create Matlab array from buffer
matlab::data::TypedArray<double> A = f.createArrayFromBuffer<double>({1, V.size()}, std::move(V_b_ptr));
在第二个 link 中,似乎有一种方法可以使用 factory.createArray(...)
来填充给定的数据。但是我无法让它工作。
我在尝试自己解决问题数小时后写下了这个问题。但在提交之前,我又给了它一个小时。我终于设法做到了。我在这里发布解决方案以防它对任何人有帮助。
如问题中的示例所示,假设我们有 std::vector
个双打 V
。
matlab::data::ArrayFactory f;
matlab::data::TypedArray<double> A = f.createArray<double>({1, V.size()}, V.data(), V.data()+V.size());