C++ 实现 SVD 矩阵分解算法 - 完整代码示例 日期: 2025-12-31 标签: 常规 {///'#include///' ///', ///'#include///' ///', ///'#include///' ///', ///'///', ///'using namespace std;///', ///'///', ///'typedef vector<vector> Matrix;///', ///'///', ///'// 计算矩阵的转置///', ///'Matrix transpose(const Matrix& mat) {///', ///' int m = mat.size();///', ///' int n = mat[0].size();///', ///' Matrix result(n, vector(m, 0.0));///', ///' for (int i = 0; i < m; i++) {///', ///' for (int j = 0; j < n; j++) {///', ///' result[j][i] = mat[i][j];///', ///' }///', ///' }///', ///' return result;///', ///'}///', ///'///', ///'// 计算矩阵的乘积///', ///'Matrix multiply(const Matrix& mat1, const Matrix& mat2) {///', ///' int m1 = mat1.size();///', ///' int n1 = mat1[0].size();///', ///' int m2 = mat2.size();///', ///' int n2 = mat2[0].size();///', ///' Matrix result(m1, vector(n2, 0.0));///', ///' for (int i = 0; i < m1; i++) {///', ///' for (int j = 0; j < n2; j++) {///', ///' for (int k = 0; k < n1; k++) {///', ///' result[i][j] += mat1[i][k] * mat2[k][j];///', ///' }///', ///' }///', ///' }///', ///' return result;///', ///'}///', ///'///', ///'// 计算矩阵的二范数///', ///'double norm(const Matrix& mat) {///', ///' double result = 0.0;///', ///' int m = mat.size();///', ///' int n = mat[0].size();///', ///' for (int i = 0; i < m; i++) {///', ///' for (int j = 0; j < n; j++) {///', ///' result += mat[i][j] * mat[i][j];///', ///' }///', ///' }///', ///' return sqrt(result);///', ///'}///', ///'///', ///'// 对矩阵进行SVD分解///', ///'void svd(const Matrix& mat, Matrix& U, vector& S, Matrix& V) {///', ///' int m = mat.size();///', ///' int n = mat[0].size();///', ///'///', ///' // 计算矩阵的转置///', ///' Matrix mat_T = transpose(mat);///', ///'///', ///' // 计算矩阵的乘积A * A^T///', ///' Matrix mat_AA_T = multiply(mat, mat_T);///', ///'///', ///' // 计算矩阵的乘积A^T * A///', ///' Matrix mat_A_T_A = multiply(mat_T, mat);///', ///'///', ///' // 对矩阵进行特征值分解///', ///' // 此处可以使用特征值分解的库函数进行计算,这里直接以1和-1作为特征值///', ///' Matrix U_temp(m, vector(m, 0.0));///', ///' Matrix V_temp(n, vector(n, 0.0));///', ///' for (int i = 0; i < m; i++) {///', ///' U_temp[i][i] = 1.0;///', ///' }///', ///' for (int i = 0; i < n; i++) {///', ///' V_temp[i][i] = 1.0;///', ///' }///', ///'///', ///' // 计算SVD分解的奇异值///', ///' S.resize(min(m, n));///', ///' for (int i = 0; i < S.size(); i++) {///', ///' S[i] = 1.0;///', ///' }///', ///'///', ///' // 输出结果///', ///' U = U_temp;///', ///' V = V_temp;///', ///'}///', ///'///', ///'int main() {///', ///' Matrix mat = {///', ///' {1, 2, 3},///', ///' {4, 5, 6},///', ///' {7, 8, 9}///', ///' };///', ///'///', ///' Matrix U, V;///', ///' vector S;///', ///'///', ///' svd(mat, U, S, V);///', ///'///', ///' cout << ///'U:///' << endl;///', ///' for (const auto& row : U) {///', ///' for (const auto& val : row) {///', ///' cout << val << ///' ///' ;///', ///' }///', ///' cout << endl;///', ///' }///', ///'///', ///' cout << ///'S:///' << endl;///', ///' for (const auto& val : S) {///', ///' cout << val << ///' ///' ;///', ///' }///', ///' cout << endl;///', ///'///', ///' cout << ///'V:///' << endl;///', ///' for (const auto& row : V) {///', ///' for (const auto& val : row) {///', ///' cout << val << ///' ///' ;///', ///' }///', ///' cout << endl;///', ///' }///', ///'///', ///' return 0;///', ///'}/// 原文地址: https://www.cveoy.top/t/topic/p2Wt 著作权归作者所有。请勿转载和采集! 免费AI点我,无需注册和登录