> 技术文档 > armadillo vec 数据如何转为vector_arma::vec::t()

armadillo vec 数据如何转为vector_arma::vec::t()

Armadillo 中,将 vec(列向量)转换为 C++ 标准库的 std::vector 可以通过以下方法实现:


方法 1:使用 conv_to 显式转换

Armadillo 提供了 conv_to::from() 函数,可以直接将 vec 转为 std::vector

cpp

复制

#include #include int main() { arma::vec arma_vec = {1.0, 2.0, 3.0, 4.0}; // 转换为 std::vector std::vector std_vec = arma::conv_to<std::vector>::from(arma_vec); // 验证输出 for (double val : std_vec) { std::cout << val << \" \"; } // 输出: 1 2 3 4 return 0;}

方法 2:通过内存拷贝(高效)

直接通过 memcpy 或 Armadillo 的 .memptr() 访问底层内存(需确保类型匹配):

cpp

复制

arma::vec arma_vec = randu(1000); // 示例:1000 维随机向量std::vector std_vec(arma_vec.memptr(), arma_vec.memptr() + arma_vec.n_elem);

方法 3:手动遍历填充

适用于需要额外处理数据的情况(如类型转换):

cpp

复制

arma::vec arma_vec = linspace(0, 1, 5); // 0, 0.25, 0.5, 0.75, 1std::vector std_vec;std_vec.reserve(arma_vec.n_elem); // 预分配空间for (double val : arma_vec) { std_vec.push_back(val);}

注意事项

  1. 类型一致性

    • arma::vec 默认是 double 类型,若需转为 std::vector,需显式转换:

      cpp

      std::vector int_vec = arma::conv_to<std::vector>::from(arma_vec);
  2. 稀疏向量

    • sp_vec(稀疏向量),需先提取非零元素:

      cpp

      std::vector std_vec = arma::conv_to<std::vector>::from(nonzeros(arma_vec));
  3. 性能建议

    • 大数据量时优先用 方法 1方法 2(避免遍历开销)。

    • 小数据量或需要灵活性时用 方法 3


反向转换(std::vector → arma::vec)

如果需要将 std::vector 转回 arma::vec

cpp

std::vector std_vec = {1.1, 2.2, 3.3};arma::vec arma_vec = arma::vec(std_vec.data(), std_vec.size(), false); // 不拷贝内存// 或拷贝内存:arma::vec arma_vec_copy(std_vec.data(), std_vec.size());

完整示例

cpp

复制

#include #include #include int main() { // Armadillo 向量 → std::vector arma::vec arma_vec = arma::randu(5); std::vector std_vec = arma::conv_to<std::vector>::from(arma_vec); std::cout << \"Armadillo vec: \" << arma_vec.t(); std::cout << \"std::vector: \"; for (auto v : std_vec) std::cout << v << \" \"; return 0;}

输出:

Armadillo vec: 0.1234 0.5678 0.9012 0.3456 0.7890std::vector: 0.1234 0.5678 0.9012 0.3456 0.7890

通过以上方法,可以轻松实现 Armadillo 向量与 std::vector 的互转。根据场景选择合适的方法即可!