C++高效实现AI人工智能实例
C++高效实现AI人工智能实例
摘要:C++在人工智能领域具有独特优势,特别是在高性能计算和实时系统方面。本文展示了C++在多种AI任务中的应用实例,包括神经网络实现、计算机视觉、自然语言处理和机器学习算法。从基础数据结构到高级深度学习框架,涵盖了OpenCV、TensorFlow C++ API、Armadillo、MLPACK等工具的实际应用,以及KCF算法、朴素贝叶斯分类器等具体实现。这些示例突出了C++在内存管理、计算效率和硬件控制方面的优势,同时提供了从理论到实践的完整代码片段,适合不同层次的开发者参考和学习。
C++ 是一种高性能的编程语言,广泛应用于人工智能领域,特别是在深度学习和神经网络的实现中。尽管 Python 在人工智能领域应用广泛,但 C++ 由于其高效性、内存管理灵活性和与硬件的直接交互能力,仍然在许多关键任务中占据重要地位。
深度学习和神经网络
深度学习是一种特殊的机器学习方法,通过多层神经网络模型来学习数据的表示和特征。神经网络模拟人脑神经元结构,由多个神经元组成,每个神经元接收输入信号,通过激活函数产生输出信号。C++ 可以通过高效的计算和内存管理来实现这些复杂的计算任务。
代码示例
以下是一个简单的前馈神经网络示例,展示了如何使用 C++ 构建和训练神经网络:
#include <iostream>
#include "neural_network.h"int main() {// 创建神经网络NeuralNetwork nn;// 添加输入层nn.add_layer(new InputLayer(784));// 添加隐藏层nn.add_layer(new DenseLayer(128, "ReLU"));nn.add_layer(new DenseLayer(64, "ReLU"));// 添加输出层nn.add_layer(new DenseLayer(10, "Softmax"));// 编译神经网络nn.compile("CrossEntropy", "Adam");return 0;}
实际应用场景
C++ 在人工智能中的应用场景包括图像识别、自然语言处理、推荐系统、语音识别和游戏 AI 等。通过使用 C++,可以实现高效的计算和实时响应,这对于自动驾驶、嵌入式系统等要求高性能和低延迟的应用尤为重要。
使用C++训练神经网络的实例方法
环境准备
确保安装以下工具库:
- Eigen(线性代数运算)
- OpenCV(可选,图像数据处理)
- CMake(项目构建)
推荐通过包管理器安装:
sudo apt-get install libeigen3-dev libopencv-dev cmake
基础神经网络实现(全连接层)
定义网络结构
使用Eigen库实现全连接层和ReLU激活函数:
#include <Eigen/Dense>
using namespace Eigen;class DenseLayer {
public:MatrixXd weights;VectorXd bias;DenseLayer(int input_size, int output_size) {weights = MatrixXd::Random(input_size, output_size) * 0.01;bias = VectorXd::Zero(output_size);}MatrixXd forward(const MatrixXd& input) {return input * weights + bias.transpose().replicate(input.rows(), 1);}
};class ReLU {
public:MatrixXd forward(const MatrixXd& input) {return input.cwiseMax(0);}
};
反向传播与训练循环
损失函数与梯度计算
实现均方误差(MSE)损失和梯度下降:
double mse_loss(const MatrixXd& pred, const MatrixXd& target) {return (pred - target).array().square().mean();
}void train_step(DenseLayer& layer, const MatrixXd& input, const MatrixXd& target, double lr = 0.01) {// 前向传播MatrixXd output = layer.forward(input);// 计算梯度MatrixXd error = 2 * (output - target) / target.size();MatrixXd grad_weights = input.transpose() * error;VectorXd grad_bias = error.colwise().sum();// 更新参数layer.weights -= lr * grad_weights;layer.bias -= lr * grad_bias;
}
实例:XOR问题求解
数据准备与训练
int main() {// XOR输入输出MatrixXd X(4, 2);X << 0, 0, 0, 1, 1, 0, 1, 1;MatrixXd y(4, 1);y << 0, 1, 1, 0;DenseLayer layer1(2, 4);DenseLayer layer2(4, 1);ReLU activation;// 训练循环for (int epoch = 0; epoch < 1000; ++epoch) {MatrixXd h1 = activation.forward(layer1.forward(X));MatrixXd pred = layer2.forward(h1);double loss = mse_loss(pred, y);if (epoch % 100 == 0) std::cout << "Epoch " << epoch << " Loss: " << loss << std::endl;// 反向传播(需扩展实现)}return 0;
}
扩展实例:MNIST分类
数据加载与预处理
使用OpenCV读取MNIST图像并归一化:
cv::Mat img = cv::imread("mnist_sample.png", cv::IMREAD_GRAYSCALE);
img.convertTo(img, CV_64F, 1.0/255);
Eigen::Map<VectorXd> flattened(img.ptr<double>(), img.total());
网络结构扩展
增加Softmax输出层和交叉熵损失:
VectorXd softmax(const VectorXd& z) {VectorXd exp_z = (z.array() - z.maxCoeff()).exp();return exp_z / exp_z.sum();
}
性能优化技巧
并行计算
启用Eigen的并行计算:
Eigen::setNbThreads(4);
内存映射
处理大型数据集时使用内存映射文件:
#include <Eigen/Core>
Eigen::MatrixXd data = Eigen::Map<MatrixXd>(mmap_ptr, rows, cols);
基于C++的KANN(轻量级神经网络库)应用实例
以下是基于C++的KANN(轻量级神经网络库)应用实例,涵盖基础操作、模型构建与训练等场景。示例基于KANN库的API,需确保已正确安装并包含头文件kann.h
。
基础张量操作
#include "kann.h"// 创建并初始化张量
kad_tensor_t *tensor = kann_new_tensor(3, {2, 3, 4}); // 2x3x4张量
kann_fill(tensor, 1.0f); // 填充值为1.0
全连接层构建
kann_t *model = kann_new();
kann_layer_t *dense = kann_layer_dense(model, 10, KANN_F_LEAKY_RELU); // 10个神经元,激活函数为LeakyReLU
卷积神经网络
kann_t *model = kann_new();
kann_layer_t *conv = kann_layer_conv2d(model, 16, 3, 3, 1, 1, KANN_F_RELU); // 16个3x3卷积核
kann_layer_t *pool = kann_layer_maxpool2d(model, 2, 2); // 2x2最大池化
LSTM网络
kann_t *model = kann_new();
kann_layer_t *lstm = kann_layer_lstm(model, 32, 0); // 32个LSTM单元,无双向
模型编译与训练
kann_train_fnn(model, 0.001f, 64, 10, 0.1f, train_data, train_labels); // 学习率0.001,batch=64,10轮
保存与加载模型
kann_save("model.kan", model); // 保存模型
kann_t *loaded = kann_load("model.kan"); // 加载模型
自定义损失函数
kann_t *model = kann_new();
kann_layer_t *loss = kann_layer_cost(model, 1, KANN_C_CE); // 交叉熵损失
数据标准化
kann_data_norm(train_data, KANN_NORM_MINMAX); // 归一化到[0,1]
Dropout层
kann_layer_t *drop = kann_layer_dropout(model, 0.5f); // 50%丢弃率
模型预测
float *output = kann_apply1(model, input_data); // 单样本预测
多输入模型
kann_t *model = kann_new();
kann_layer_t *in1 = kann_layer_input(model, 10);
kann_layer_t *in2 = kann_layer_input(model, 20);
kann_layer_t *merge = kann_layer_concat(model, 2, in1, in2);
学习率调度
kann_set_learning_rate(model, 0.001f * pow(0.9, epoch)); // 指数衰减
早停机制
kann_train_fnn(model, ..., KANN_EARLY_STOP); // 启用早停
模型评估
float acc = kann_eval_fnn(model, test_data, test_labels, 0); // 计算准确率
批归一化层
kann_layer_t *bn = kann_layer_bnorm(model); // 批归一化
自定义优化器
kann_set_optimizer(model, KANN_OPT_ADAM); // 使用Adam优化器
混合精度训练
kann_enable_mixed_precision(model); // 启用FP16加速
模型剪枝
kann_prune(model, 0.3f); // 剪枝30%权重
模型可视化
kann_dot(model, "graph.dot"); // 生成DOT格式结构图
多任务学习
kann_t *model = kann_new();
kann_layer_t *shared = kann_layer_dense(model, 64, KANN_F_RELU);
kann_layer_t *task1 = kann_layer_cost(model, 1, KANN_C_MSE);
kann_layer_t *task2 = kann_layer_cost(model, 1, KANN_C_CE);
以上示例需结合具体数据和需求调整参数。KANN的轻量级特性使其适合嵌入式或资源受限场景,更多高级功能。
基于C++和OpenCV的实用案例
以下是一些基于C++和OpenCV的实用案例,涵盖图像处理、计算机视觉等常见任务。案例按功能分类,代码简洁可直接运行(需配置OpenCV环境)。
图像基本操作
读取/显示/保存图像
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {Mat img = imread("image.jpg");imshow("Display", img);imwrite("output.jpg", img);waitKey(0);return 0;
}
灰度图转换
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
调整亮度对比度
Mat adjusted;
img.convertTo(adjusted, -1, 1.5, 30); // alpha=1.5, beta=30
图像处理技术
边缘检测(Canny)
Mat edges;
Canny(img, edges, 50, 150);
直方图均衡化
Mat histEq;
equalizeHist(gray, histEq);
高斯模糊
GaussianBlur(img, img, Size(5,5), 0);
特征检测与匹配
SIFT特征点
Ptr<SIFT> sift = SIFT::create();
std::vector<KeyPoint> kp;
Mat desc;
sift->detectAndCompute(img, Mat(), kp, desc);
ORB特征匹配
Ptr<ORB> orb = ORB::create();
BFMatcher matcher(NORM_HAMMING);
std::vector<DMatch> matches;
matcher.match(desc1, desc2, matches);
对象识别与跟踪
Haar人脸检测
CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_default.xml");
std::vector<Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 3);
YOLOv3目标检测
Net net = readNet("yolov3.weights", "yolov3.cfg");
net.setInput(blob);
Mat detections = net.forward();
视频处理
读取摄像头帧
VideoCapture cap(0);
while (true) {Mat frame;cap >> frame;imshow("Camera", frame);if (waitKey(30) == 27) break;
}
视频背景减除
Ptr<BackgroundSubtractorMOG2> bg_model = createBackgroundSubtractorMOG2();
Mat fg_mask;
bg_model->apply(frame, fg_mask);
高级应用
图像拼接(Panorama)
Stitcher::Mode mode = Stitcher::PANORAMA;
Ptr<Stitcher> stitcher = Stitcher::create(mode);
stitcher->stitch(imgs, panorama);
AR标记检测(ArUco)
Ptr<aruco::Dictionary> dict = aruco::getPredefinedDictionary(aruco::DICT_6X6_250);
aruco::detectMarkers(img, dict, corners, ids);
实用工具
绘制文本
putText(img, "Hello", Point(50,50), FONT_HERSHEY_SIMPLEX, 1, Scalar(255,0,0), 2);
鼠标事件交互
setMouseCallback("Window", [](int event, int x, int y, int flags, void* userdata) {if (event == EVENT_LBUTTONDOWN) {circle(img, Point(x,y), 5, Scalar(0,0,255), -1);}
});
注意事项
- 所有案例需链接OpenCV库(如
opencv_core
,opencv_highgui
等) - 部分功能(如YOLO、SIFT)需额外模型文件
- OpenCV4.x中部分模块(如SIFT)需
opencv_contrib
支持
完整项目可参考OpenCV官方示例库或GitHub上的开源项目(如OpenCV-Cookbook)。
基于C++的YOLO(目标检测)
以下是基于C++的YOLO(目标检测)和SIFT(特征提取)的实例分类及实现方法。内容涵盖基础应用、进阶优化及实际场景案例,均以代码片段或逻辑描述呈现。
YOLO 实例
目标检测基础
// 示例1: 加载YOLOv3模型并检测图像中的对象
cv::dnn::Net net = cv::dnn::readNetFromDarknet("yolov3.cfg", "yolov3.weights");
cv::Mat img = cv::imread("image.jpg");
cv::Mat blob = cv::dnn::blobFromImage(img, 1/255.0, cv::Size(416, 416));
net.setInput(blob);
std::vector<cv::Mat> outputs;
net.forward(outputs, net.getUnconnectedOutLayersNames());
视频流处理
// 示例2: 实时摄像头YOLO检测
cv::VideoCapture cap(0);
while (true) {cv::Mat frame;cap >> frame;cv::Mat blob = cv::dnn::blobFromImage(frame, 1/255.0, cv::Size(416, 416));net.setInput(blob);net.forward(outputs, net.getUnconnectedOutLayersNames());// 绘制检测框逻辑
}
多线程推理
// 示例3: 使用异步加速推理
std::future<void> fut = std::async(std::launch::async, [&]() {net.forward(outputs, net.getUnconnectedOutLayersNames());
});
自定义对象训练
// 示例4: 训练YOLOv4-tiny自定义数据集
// 需准备darknet框架及配置文件
./darknet detector train data/obj.data cfg/yolov4-tiny-custom.cfg yolov4-tiny.weights
模型量化
// 示例5: 使用OpenVINO优化YOLO模型
cv::dnn::Net net = cv::dnn::readNet("yolov5.xml", "yolov5.bin");
net.setPreferableBackend(cv::dnn::DNN_BACKEND_INFERENCE_ENGINE);
ROS集成
// 示例6: 在ROS中发布YOLO检测结果
ros::Publisher pub = nh.advertise<sensor_msgs::Image>("detections", 10);
cv_bridge::CvImage cv_img;
cv_img.image = output_frame;
pub.publish(cv_img.toImageMsg());
边缘设备部署
// 示例7: 在Jetson Nano上运行YOLOv5
// 需使用TensorRT引擎转换模型
nvinfer1::ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream);
性能评估
// 示例8: 计算mAP指标
./darknet detector map data/obj.data cfg/yolov3.cfg yolov3.weights
非极大值抑制优化
// 示例9: 自定义NMS阈值
void NMSBoxes(const std::vector<cv::Rect>& boxes, float score_threshold, float nms_threshold) {cv::dnn::NMSBoxes(boxes, scores, score_threshold, nms_threshold, indices);
}
多尺度检测
// 示例10: 多尺度输入提升小目标检测
std::vector<cv::Mat> pyramid;
cv::buildPyramid(img, pyramid, 3);
for (auto& level : pyramid) {cv::Mat blob = cv::dnn::blobFromImage(level, 1/255.0, cv::Size(416, 416));net.setInput(blob);net.forward(outputs);
}
类别过滤
// 示例11: 只检测特定类别(如行人)
if (class_ids[i] == 0) { // COCO数据集中0为personcv::rectangle(img, boxes[i], cv::Scalar(0,255,0), 2);
}
模型剪枝
// 示例12: 使用Torch-Pruning裁剪YOLO模型
prune_model(model, 0.3); // 裁剪30%的通道
TensorRT加速
// 示例13: 转换ONNX模型为TensorRT引擎
trtexec --onnx=yolov5s.onnx --saveEngine=yolov5s.trt --fp16
动态输入支持
// 示例14: 处理可变分辨率输入
net.enableWinograd(false); // 关闭Winograd加速以支持动态尺寸
异常处理
// 示例15: 模型加载失败检测
if (net.empty()) {std::cerr << "Failed to load model" << std::endl;return -1;
}
SIFT 实例
特征提取基础
// 示例16: 提取SIFT特征点
cv::Ptr<cv::SIFT> sift = cv::SIFT::create();
std::vector<cv::KeyPoint> keypoints;
cv::Mat descriptors;
sift->detectAndCompute(img, cv::noArray(), keypoints, descriptors);
特征匹配
// 示例17: 暴力匹配器
cv::BFMatcher matcher(cv::NORM_L2);
std::vector<cv::DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
RANSAC筛选
// 示例18: 几何一致性验证
std::vector<cv::Point2f> points1, points2;
cv::Mat H = cv::findHomography(points1, points2, cv::RANSAC, 5.0);
图像拼接
// 示例19: 全景图生成
cv::Stitcher stitcher = cv::Stitcher::createDefault();
cv::Mat panorama;
stitcher.stitch(images, panorama);
3D重建
// 示例20: 从匹配点计算深度
cv::triangulatePoints(P1, P2, points1, points2, points4D);
相机位姿估计
// 示例21: 求解PnP问题
cv::solvePnP(object_points, image_points, camera_matrix, dist_coeffs, rvec, tvec);
特征点可视化
// 示例22: 绘制关键点
cv::drawKeypoints(img, keypoints, out_img, cv::Scalar(0,0,255), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
描述子聚类
// 示例23: 构建视觉词袋
cv::BOWKMeansTrainer bow_trainer(100); // 100个聚类中心
bow_trainer.add(descriptors);
cv::Mat vocabulary = bow_trainer.cluster();
实时跟踪
// 示例24: 基于特征点的光流跟踪
cv::calcOpticalFlowPyrLK(prev_img, next_img, prev_pts, next_pts, status, err);
多模态匹配
// 示例25: 红外与可见光图像配准
cv::xfeatures2d::matchGMS(img1.size(), img2.size(), keypoints1, keypoints2, matches);
GPU加速
// 示例26: 使用CUDA加速SIFT
cv::cuda::SIFT_CUDA sift_gpu;
sift_gpu.detectAndComputeAsync(gpu_img, cv::noArray(), gpu_kpts, gpu_desc);
尺度不变验证
// 示例27: 验证特征点尺度响应
if (keypoints[i].octave > 2) { // 过滤低尺度特征filtered_kpts.push_back(keypoints[i]);
}
动态场景处理
// 示例28: 运动目标分割
cv::absdiff(prev_frame, curr_frame, diff_frame);
cv::threshold(diff_frame, mask, 25, 255, cv::THRESH_BINARY);
嵌入式部署
// 示例29: 在树莓派上优化SIFT
cv::SIFT::create(0, 3, 0.04, 10); // 减少特征点数量
异常检测
// 示例30: 匹配质量评估
double max_dist = *std::max_element(matches.begin(), matches.end());
if (max_dist > 300) {std::cout << "Low matching quality" << std::endl;
}
以上实例均需依赖OpenCV(建议4.5+版本)及相关扩展库实现。实际应用时需根据硬件环境调整参数,部分高阶功能需要额外配置CUDA或OpenCL支持。
基于C++ Armadillo库的实例
以下是基于C++ Armadillo库的实用示例,涵盖矩阵操作、线性代数、统计计算等常见场景。所有示例需包含<armadillo>
头文件,并使用arma
命名空间。
基础矩阵操作
创建矩阵并初始化
arma::mat A = {{1, 2}, {3, 4}}; // 2x2矩阵
arma::mat B = arma::randu(3, 4); // 3x4随机矩阵
arma::mat C = arma::eye(5, 5); // 5x5单位矩阵
矩阵转置
arma::mat D = A.t(); // 转置
矩阵乘法
arma::mat E = A * B; // 矩阵乘法(需维度匹配)
逐元素操作
arma::mat F = A % B; // 逐元素乘法
arma::mat G = A + B; // 逐元素加法
矩阵求逆
arma::mat H = arma::inv(A); // 逆矩阵(需方阵)
线性代数运算
解线性方程组
arma::vec b = {5, 6};
arma::vec x = arma::solve(A, b); // Ax = b
特征值与特征向量
arma::cx_vec eigval;
arma::cx_mat eigvec;
arma::eig_gen(eigval, eigvec, A); // 广义特征分解
奇异值分解(SVD)
arma::mat U, V;
arma::vec s;
arma::svd(U, s, V, A); // A = U*diagmat(s)*V.t()
Cholesky分解
arma::mat L = arma::chol(A, "lower"); // A需对称正定
统计计算
计算均值与方差
double mean_val = arma::mean(A);
double var_val = arma::var(A);
矩阵行列式
double det_val = arma::det(A);
矩阵迹
double trace_val = arma::trace(A);
相关系数矩阵
arma::mat corr_mat = arma::cor(B);
高级操作
矩阵拼接
arma::mat J = arma::join_rows(A, B); // 水平拼接
arma::mat K = arma::join_cols(A, B); // 垂直拼接
矩阵重塑
arma::mat L = arma::reshape(A, 4, 1); // 重塑为4x1向量
条件筛选
arma::uvec idx = find(A > 2); // 返回满足条件的索引
arma::mat M = A.elem(idx); // 提取对应元素
保存与加载矩阵
A.save("matrix.bin", arma::arma_binary); // 二进制保存
arma::mat N;
N.load("matrix.bin"); // 二进制加载
稀疏矩阵操作
创建稀疏矩阵
arma::sp_mat S(100, 100);
S(1, 2) = 3.0; // 设置非零元素
稀疏矩阵乘法
arma::sp_mat T = S * S.t(); // 稀疏矩阵乘法
稀疏矩阵求解
arma::vec y = arma::spsolve(S, b); // 稀疏求解器
性能优化
预分配内存
arma::mat P;
P.set_size(1000, 1000); // 预分配内存
多线程加速
arma::mat Q = arma::randn(1000, 1000);
arma::mat R = Q * Q.t(); // 自动使用OpenMP多线程(需编译支持)
实用函数
生成序列
arma::vec seq = arma::linspace(0, 10, 100); // 0到10的100个等间隔点
随机数生成
arma::mat rand_mat = arma::randn(5, 5); // 标准正态分布
复数矩阵
arma::cx_mat Z = arma::randu<arma::cx_mat>(3, 3); // 复数随机矩阵
逻辑运算
arma::umat logic = (A > B); // 返回布尔矩阵
按索引访问
double elem = A(1, 1); // 访问(1,1)元素
Armadillo 基础矩阵操作
以下示例展示如何在 C++ 中使用 Armadillo 进行基础的矩阵创建和运算:
#include <armadillo>
using namespace arma;// 创建 3x3 单位矩阵
mat A = eye<mat>(3, 3);// 创建随机矩阵(范围 0-1)
mat B = randu<mat>(3, 3);// 矩阵乘法
mat C = A * B;// 逐元素乘法
mat D = A % B;// 输出结果
cout << "Matrix C:\n" << C << endl;
cout << "Matrix D:\n" << D << endl;
解线性方程组
使用 solve()
函数求解线性方程组 ( Ax = b ):
mat A = {{1, 2}, {3, 4}};
vec b = {5, 6};
vec x = solve(A, b);cout << "Solution x:\n" << x << endl;
特征值与特征向量
计算矩阵的特征值和特征向量:
mat A = randu<mat>(5, 5);
cx_vec eigval;
mat eigvec;eig_gen(eigval, eigvec, A);cout << "Eigenvalues:\n" << eigval << endl;
cout << "Eigenvectors:\n" << eigvec << endl;
奇异值分解(SVD)
分解矩阵为 ( U \Sigma V^T ):
mat A = randu<mat>(4, 5);
mat U, V;
vec s;svd(U, s, V, A);cout << "Singular values:\n" << s << endl;
矩阵求逆
使用 inv()
函数求逆矩阵:
mat A = randu<mat>(3, 3);
mat A_inv = inv(A);cout << "Inverse of A:\n" << A_inv << endl;
矩阵伪逆
对于非方阵或病态矩阵,使用 pinv()
:
mat A = randu<mat>(2, 3);
mat A_pinv = pinv(A);cout << "Pseudoinverse of A:\n" << A_pinv << endl;
Cholesky 分解
对对称正定矩阵进行分解:
mat A = randu<mat>(5, 5);
mat L = chol(A); // A = L^T * Lcout << "Cholesky factor L:\n" << L << endl;
QR 分解
分解矩阵为 ( Q ) 和 ( R ):
mat A = randu<mat>(4, 4);
mat Q, R;qr(Q, R, A);cout << "Q matrix:\n" << Q << endl;
cout << "R matrix:\n" << R << endl;
LU 分解
分解矩阵为 ( P ), ( L ), 和 ( U ):
mat A = randu<mat>(4, 4);
mat P, L, U;lu(P, L, U, A);cout << "Lower triangular L:\n" << L << endl;
cout << "Upper triangular U:\n" << U << endl;
矩阵范数
计算矩阵的 1-范数、2-范数和 Frobenius 范数:
mat A = randu<mat>(3, 3);
double norm1 = norm(A, 1); // 1-范数
double norm2 = norm(A, 2); // 2-范数
double normF = norm(A, "fro"); // Frobenius 范数cout << "1-Norm: " << norm1 << endl;
cout << "2-Norm: " << norm2 << endl;
cout << "Frobenius Norm: " << normF << endl;
矩阵拼接
水平或垂直拼接矩阵:
mat A = randu<mat>(2, 2);
mat B = randu<mat>(2, 2);mat C = join_horiz(A, B); // 水平拼接
mat D = join_vert(A, B); // 垂直拼接cout << "Horizontal concatenation:\n" << C << endl;
cout << "Vertical concatenation:\n" << D << endl;
子矩阵提取
提取矩阵的子块或特定行/列:
mat A = randu<mat>(5, 5);
mat B = A.submat(1, 1, 3, 3); // 提取 1:3 行和 1:3 列
vec col = A.col(0); // 提取第 0 列
vec row = A.row(1); // 提取第 1 行cout << "Submatrix B:\n" << B << endl;
cout << "First column:\n" << col << endl;
cout << "Second row:\n" << row << endl;
矩阵转置
转置矩阵或共轭转置:
mat A = randu<mat>(3, 2);
mat B = A.t(); // 普通转置
mat C = A.st(); // 共轭转置(复数矩阵)cout << "Transpose of A:\n" << B << endl;
矩阵逐元素函数
应用逐元素函数(如指数、对数):
mat A = randu<mat>(3, 3);
mat B = exp(A); // 逐元素指数
mat C = log(A); // 逐元素自然对数cout << "Element-wise exp:\n" << B << endl;
cout << "Element-wise log:\n" << C << endl;
统计操作
计算矩阵的均值、方差等统计量:
mat A = randu<mat>(4, 4);
double mean_val = mean(mean(A)); // 整体均值
vec col_means = mean(A, 0); // 列均值
vec row_means = mean(A, 1); // 行均值cout << "Overall mean: " << mean_val << endl;
cout << "Column means:\n" << col_means << endl;
cout << "Row means:\n" << row_means << endl;
稀疏矩阵操作
创建和操作稀疏矩阵:
sp_mat A(5, 5); // 5x5 稀疏矩阵
A(1, 2) = 3.0; // 设置非零元素
A(3, 4) = 4.0;mat B = randu<mat>(5, 5);
sp_mat C = sp_mat(B); // 稠密矩阵转稀疏矩阵cout << "Sparse matrix A:\n" << A << endl;
矩阵重新整形
改变矩阵的维度但不改变元素总数: