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);}
注意事项
-
类型一致性:
-
arma::vec
默认是double
类型,若需转为std::vector
,需显式转换:cpp
std::vector int_vec = arma::conv_to<std::vector>::from(arma_vec);
-
-
稀疏向量:
-
对
sp_vec
(稀疏向量),需先提取非零元素:cpp
std::vector std_vec = arma::conv_to<std::vector>::from(nonzeros(arma_vec));
-
-
性能建议:
-
大数据量时优先用 方法 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
的互转。根据场景选择合适的方法即可!