当前位置: 首页 > news >正文

矩阵SVD分解计算

对于有数学库的时候,进行矩阵相关计算还是不复杂,但是没有数学库就很麻烦,利用算法实现了矩阵奇异值分解。

void decompose(const std::vector<std::vector<double>>& A,
        std::vector<std::vector<double>>& U, std::vector<double>& S,
        std::vector<std::vector<double>>& V) 
{
        if (A.empty() || A[0].empty()) 
        {
            throw std::invalid_argument("Matrix A cannot be empty");
        }

        size_t m = A.size();
        size_t n = A[0].size();

        if (m < n) 
        {
            throw std::invalid_argument("Number of rows must be >= number of columns in SVD");
        }

        U = A;
        S.resize(n);
        V.assign(n, std::vector<double>(n, 0.0));
        
        std::vector<double> rv1(n);
        double g = 0.0, scale = 0.0, anorm = 0.0;

        for (size_t i = 0; i < n; ++i) {
            size_t l = i + 1;
            rv1[i] = scale * g;
            g = scale = 0.0;

            if (i < m) {
                for (size_t k = i; k < m; ++k) scale += std::abs(U[k][i]);
                if (scale != 0.0) {
                    for (size_t k = i; k < m; ++k) {
                        U[k][i] /= scale;
                        g += U[k][i] * U[k][i];
                    }
                    double f = U[i][i];
                    g = -sign(std::sqrt(g), f);
                    double h = f * g - g * g;
                    U[i][i] = f - g;
                    for (size_t j = l; j < n; ++j) {
                        double s = 0.0;
                        for (size_t k = i; k < m; ++k) s += U[k][i] * U[k][j];
                        f = s / h;
                        for (size_t k = i; k < m; ++k) U[k][j] += f * U[k][i];
                    }
                    for (size_t k = i; k < m; ++k) U[k][i] *= scale;
                }
            }
            S[i] = scale * g;

            g = scale = 0.0;
            if (i < m && i != n - 1) {
                for (size_t k = l; k < n; ++k) scale += std::abs(U[i][k]);
                if (scale != 0.0) {
                    for (size_t k = l; k < n; ++k) {
                        U[i][k] /= scale;
                        g += U[i][k

http://www.dtcms.com/a/291954.html

相关文章:

  • 今日Github热门仓库推荐 第八期
  • 3ds Max 云端渲染插件 - 完整 Python 解决方案
  • 锟斤拷与烫烫烫:中文编程界的独特印记
  • Go语言切片(Slice)与数组(Array)深度解析:避坑指南与最佳实践
  • Go语言实战案例-遍历目录下所有文件
  • Go 的第一类对象与闭包
  • 基于单片机智能衣柜/智能衣橱设计
  • Go 并发(协程,通道,锁,协程控制)
  • 【Unity开发】坦克大战项目实现总结
  • Golang避免主协程退出方案
  • GoLang教程007:打印空心金字塔
  • PHP与Web页面交互:从基础表单到AJAX实战
  • 八大作业票(二)受限空间安全作业证
  • 智算中心光纤线缆如何实现自动化计算?
  • 汽车安全 | 汽车安全入门
  • 【机器学习】第五章 聚类算法
  • SpringBoot--Mapper XML 和 Mapper 接口在不同包
  • 基于Kubernetes的微服务CI/CD:Jenkins Pipeline全流程实践
  • 时序数据库 TDengine × Ontop:三步构建你的时序知识图谱
  • 【SVM】支持向量机实例合集
  • Dockerfile:镜像构建
  • 在资源受限单片机中使用printf等可变参函数时的陷阱(2025年7月22日)
  • DF与介质损耗
  • 深入解析谱聚类:RatioCut与Ncut的图拉普拉斯推导
  • AI AgentLLM架构演进的大逻辑和小脉络
  • RK3568 Linux驱动学习——SDK烧录
  • Docker 安装、常用命令、应用部署
  • Android接入RocketMQ的文章链接
  • JavaScript,发生异常,try...catch...finally处理,继续向上层调用者传递异常信息
  • 20250722在Ubuntu 24.04.2下配置编译RD-RK3588开发板的Android13的编译环境