SVD分解的并行实现

2023-10-31

在之前的文章中,我对SVD进行了大致的了解,它在互联网高端领域中有广泛的应用,至于它的一些详细应

用以后再进一步学习。现在主要的问题是如何有效地实现SVD分解,接下来我会先用两种方法来实现SVD分

解,即基于双边Jacobi旋转的SVD基于单边Jacobi旋转的SVD

 

这两种方法重点参考中国知网上的一篇论文:《并行JACOBI方法求解矩阵奇异值的研究》

 

代码:

[cpp]  view plain  copy   在CODE上查看代码片 派生到我的代码片
  1. #include <string.h>  
  2. #include <stdio.h>  
  3. #include <math.h>  
  4. #include <map>  
  5.    
  6. #include "matrix.h"  
  7.    
  8. using namespace std;  
  9.    
  10. const double EPS = 1e-8;  
  11. const int ITER_NUM = 30;  
  12.    
  13. int sign(double x)  
  14. {  
  15.     if(x < 0) return -1;  
  16.     return 1;  
  17. }  
  18.    
  19. void rotate(Matrix<double> &matrix, int i, int j, bool &pass, Matrix<double> &J)  
  20. {  
  21.     double ele = matrix.get(i, j);  
  22.     if(fabs(ele) < EPS) return;  
  23.    
  24.     pass = false;  
  25.     double ele1 = matrix.get(i, i);  
  26.     double ele2 = matrix.get(j, j);  
  27.     double tao = (ele1 - ele2) / (2 * ele);  
  28.     double tan = sign(tao) / (fabs(tao) + sqrt(1 + pow(tao, 2)));  
  29.     double cos = 1 / sqrt(1 + pow(tan, 2));  
  30.     double sin = cos * tan;  
  31.    
  32.     int size = matrix.getRows();  
  33.     Matrix<double>G(IdentityMatrix<double>(size, size));  
  34.     G.put(i, i, cos);  
  35.     G.put(i, j, -1 * sin);  
  36.     G.put(j, i, sin);  
  37.     G.put(j, j, cos);  
  38.    
  39.     matrix = G.getTranspose() * matrix * G;  
  40.     J *= G;  
  41. }  
  42.    
  43. void jacobi(Matrix<double> &matrix, int size, vector<double> &E, Matrix<double> &J)  
  44. {  
  45.     int iter_num = ITER_NUM;  
  46.     while(iter_num-- > 0)  
  47.     {  
  48.         bool pass = true;  
  49.         for(int i = 0; i < size; i++)  
  50.         {  
  51.             for(int j = i + 1; j < size; j++)  
  52.                 rotate(matrix, i, j, pass, J);  
  53.         }  
  54.         if(pass) break;  
  55.     }  
  56.     cout << "迭代次数:" << ITER_NUM - iter_num << endl;  
  57.    
  58.     for(int i = 0; i < size; i++)  
  59.     {  
  60.         E[i] = matrix.get(i, i);  
  61.         if(E[i] < EPS)  
  62.             E[i] = 0.0;  
  63.     }  
  64. }  
  65.    
  66. void svd(Matrix<double> &A, Matrix<double> &U, Matrix<double> &V, vector<double> &E)  
  67. {  
  68.     int rows = A.getRows();  
  69.     int columns = A.getColumns();  
  70.     assert(rows <= columns);  
  71.     assert(U.getRows() == rows);  
  72.     assert(U.getColumns() == rows);  
  73.     assert(V.getRows() == columns);  
  74.     assert(V.getColumns() == columns);  
  75.     assert(E.size() == columns);  
  76.    
  77.     Matrix<double> B = A.getTranspose() * A;  
  78.     Matrix<double> J(IdentityMatrix<double>(columns, columns));  
  79.     vector<double> S(columns);  
  80.     jacobi(B, columns, S, J);  
  81.     for(int i = 0; i < S.size(); i++)  
  82.         S[i] = sqrt(S[i]);  
  83.    
  84.     multimap<doubleint> eigen;  
  85.     for(int i = 0; i < S.size(); i++)  
  86.         eigen.insert(make_pair(S[i], i));  
  87.     multimap<doubleint>::const_iterator iter = --eigen.end();  
  88.     int num_eig = 0;  
  89.     for(int i = 0; i < columns; i++, iter--)  
  90.     {  
  91.         int index = iter->second;  
  92.         E[i] = S[index];  
  93.         if(E[i] > EPS)  
  94.             num_eig++;  
  95.         for(int row = 0; row < columns; row++)  
  96.             V.put(row, i, J.get(row, index));  
  97.     }  
  98.    
  99.     assert(num_eig <= rows);  
  100.     for(int i = 0; i < num_eig; i++)  
  101.     {  
  102.         Matrix<double> vi = V.getColumn(i);  
  103.         double sigma = E[i];  
  104.         Matrix<double> ui(rows, 1);  
  105.         ui = A * vi;  
  106.         for(int j = 0; j < rows; j++)  
  107.             U.put(j, i, ui.get(j, 0) / sigma);  
  108.     }  
  109. }  
  110.    
  111. int main()  
  112. {  
  113.     const int ROW = 4;  
  114.     const int COL = 5;  
  115.     assert(ROW <= COL);  
  116.     double arr[ROW * COL] =  
  117.     {1, 0, 0, 0, 2,  
  118.      0, 0, 3, 0, 0,  
  119.      0, 0, 0, 0, 0,  
  120.      0, 4, 0, 0, 0  
  121.      };  
  122.     Matrix<double> A(ROW, COL);  
  123.     A = arr;  
  124.    
  125.     Matrix<double> U(ROW, ROW);  
  126.     Matrix<double> V(COL, COL);  
  127.     vector<double> E(COL);  
  128.    
  129.     svd(A, U, V, E);  
  130.     Matrix<double> Sigma(ROW, COL);  
  131.     for(int i = 0; i < ROW; i++)  
  132.         Sigma.put(i, i, E[i]);  
  133.    
  134.     cout << "U = " << endl << U;  
  135.     cout << "Sigma = " << endl << Sigma;  
  136.     cout << "V^T = " << endl << V.getTranspose();  
  137.    
  138.     Matrix<double> AA = U * Sigma * V.getTranspose();  
  139.     cout << "Result AA = " << endl << AA;  
  140.    
  141.     return 0;  
  142. }  


 

供参考文章:http://www.cnblogs.com/zhangchaoyang/articles/2575948.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SVD分解的并行实现 的相关文章

  • 数学知识---数论(质数和约数)

    文章目录 1 质数1 1质数的判定 试除法1 2分解质因数 试除法 1 3筛质数2 约数2 1试除法求约数2 2约数个数2 3约数之和2 4最大公约数 欧几里得算法 xff08 辗转相除法 xff09 1 质数 质数是针对所有大于1的自然数
  • 20201013 矩阵2范数matlab求解

    这里是引用n norm X 返回矩阵 X 的 2 范数或最大奇异值 该值近似于 max svd X 示例 n norm X p 返回矩阵 X 的 p 范数 其中 p 为 1 2 或 Inf https ww2 mathworks cn he
  • 【蓝桥杯】1246. 等差数列*

    穿越隧道 计算每两项差值之间的最大公因数 最后的值则为数列的等差 include
  • FFT将时域信号变换到频域里面的一些重要知识点记录

    一 FFT是离散傅立叶变换 采样得到的数字信号 就可以做FFT变换了 N个采样点 经过FFT之后 就可以得到N个点的FFT结果 为了方便进行FFT运算 通常N取2的整数次方 假设采样频率为Fs 信号频率F 采样点数为N 那么FFT之后结果就
  • Sherman-Morrison-Woodbury公式的证明

    首先证明Sherman Morrison公式 A uvT 1 A 1 A 1u 1 vTA 1u 1vTA 1 1 其中 A Rn n非奇异 即A 1存在 u Rn v Rn SM公式看似复杂 但可以通过求解以下线性方程组来推导出来 A u
  • Acwing-877. 扩展欧几里得算法

    include
  • 2023-9-8 求组合数(一)

    题目链接 求组合数 I include
  • 矩阵内积运算

    设有矩阵A a1 a2 a3 a4 和矩阵 B b1 b2 b3 b4 那么矩阵A与B的内积为 内积 a1 x b1 a2 x b2 a3 x b3 a4 x b4
  • 矩阵特征值与行列式、迹的关系

    矩阵特征值与行列式 迹的关系 from http www cnblogs com AndyJee p 3737592 html 矩阵的特征值之积等于矩阵的行列式 矩阵的特征值之和等于矩阵的迹 简单的理解证明如下 1 二次方程的韦达定理 请思
  • 简单博弈论(Nim游戏)

    891 Nim游戏 题目 提交记录 讨论 题解 视频讲解 给定 n 堆石子 两位玩家轮流操作 每次操作可以从任意一堆石子中拿走任意数量的石子 可以拿完 但不能不拿 最后无法进行操作的人视为失败 问如果两人都采用最优策略 先手是否必胜 输入格
  • Acwing-4644. 求和

    暴力解法 TLE了hh include
  • Acwing-873. 欧拉函数

    欧拉函数的证明使用了容斥原理 include
  • 浅谈对梯度下降法的理解

    浅谈梯度下降法 如果读者对方向导数和梯度的定义不太了解 请先阅读上篇文章 方向导数与梯度 前些时间接触了机器学习 发现梯度下降法是机器学习里比较基础又比较重要的一个求最小值的算法 梯度下降算法过程如下 1 随机初始值 2 迭代 直至收敛 表
  • 组合数学-鸽巢原理

    中国剩余定理证明笔记
  • 统计学离散型变量和连续型变量有什么区别?

    离散变量是指其数值只能用自然数或整数单位计算的则为离散变量 例如 企业个数 职工人数 设备台数等 只能按计量单位数计数 这种变量的数值一般用计数方法取得 反之 在一定区间内可以任意取值的变量叫连续变量 其数值是连续不断的 相邻两个数值可作无
  • 4261. 孤独的照片

    数据范围为500 000 所以应该控制在O nlogn 或O n 我们发现要枚举的子串它其中有一个字母只出现一次 所以 我们可以去枚举只出现一次的字母是哪个 假设在第i个位置的字母为G 我们要枚举包含这个字母的 且只包含一个G的 且长度大于
  • Acwing-27. 数值的整数次方

    由于本题的指数是int范围 可能很大 所以需要用快速幂 Acwing 875 快速幂 中有详细介绍快速幂 点击链接即可传送 求解 https blog csdn net weixin 43844521 article details 127
  • Acwing-4366. 上课睡觉

    假设最终答案为每堆石子均为cnt个 cnt一定可以整除sum 石子的总数 我们可以依次枚举答案 sum小于等于10 6 所以cnt的数量等于sum约数的个数 10 6范围内 约数最多的数为720720 它的约数个数有240个 int范围内
  • Acwing-4729. 解密

    如果dt小于0 或者r不是整数 或者m r是奇数的话 m 2 与 m 2 的奇偶性相同 那么方程无解 输出NO include
  • Acwing 890. 能被整除的数

    注 S 表示集合S中的元素个数 对于 S1 U S2 U S3 U U Sn 中的任意一个元素x 证明在等式右侧只被计算一次 上述证明中假设x属于k个集合 推出x会被计算的次数 注 Si是指1 n中i的倍数的个数 使用容斥原理的时间复杂度是

随机推荐

  • 使用maven引入第三方jar包以及打包

    我们知道 Maven 是通过仓库对依赖进行管理的 当 Maven 项目需要某个依赖时 只要其 POM 中声明了依赖的坐标信息 Maven 就会自动从仓库中去下载该构件使用 但在实际的开发过程中 经常会遇到一种情况 对接第三方厂商 人家给了一
  • 人脸库dlib安装

    yum install gcc gcc c cmake pip3 install dlib i https pypi tuna tsinghua edu cn simple
  • mongodb的更新语句

    MongoDB 使用 update 和 save 方法来更新集合中的文档 update 方法 update 方法用于更新已存在的文档 语法格式如下 db collection update
  • STM32--0.96寸OLED显示屏

    1 OLED屏幕介绍 OLED有机发光二极管又称为有机激光显示 OL ED显示技术具有自发光的特性 采用非常薄的有机材料涂层 和玻璃基板 当有电流通过时 这些有机材料就会发光 而且OLED显示屏幕可视角大 功耗低 OL ED由于同时具备自发
  • 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具 受大极大的关注 铁路售票的管理者都主要考虑降低成本 提升售票服务满意度 一年一度的春运和节假日出行高峰期 给众多的出行群众者带来了极大的烦恼 也给用户购买火车票造成了巨大的不方便 本
  • 未来几年学什么设计更有前途?

    设计 是把一种设想通过合理的规划 周密的计划 通过各种感觉形式传达出来的过程 是设计师有目标有计划的进行技术性的创作与创意活动 设计的任务不只是为生活和商业服务 同时也伴有艺术性的创作 它是一个很大范围的概念 如果单问未来几年学什么设计更有
  • 朴素贝叶斯分类器(Naive Bayes Classifiers)

    原文地址 Naive Bayes Classifiers 本文讨论的是朴素贝叶斯分类器 Naive Bayes classifiers 背后的理论以及其的实现 朴素贝叶斯分类器是分类算法集合中基于贝叶斯理论的一种算法 它不是单一存在的 而是
  • 西门子工业无线IWLAN和漏波电缆RCoax的安装与配置方法

    1 目的 安装和配置西门子IWLAN工业无线通信 包括工业无线AP 客户端和RCoax漏波电缆 从而实现两个PLC的无线通信 智能IO设备 博途工控人平时在哪里技术交流博途工控人社群 博途工控人平时在哪里技术交流博途工控人社群 2 硬件布置
  • 基于Vue + Antd 搭建自己的博客后台管理系统

    博客后台管理 博客前台的项目地址 github com WqhForGitHu 前言 博客后台管理是基于 Vue Antd 实现的 Antd 确实是非常适合中后台应用的开发 有非常多的组件可以使用 非常多的组件可以使用 技术栈 Vue an
  • 将秒数转化为日期、时、分、秒

    1 说明 笔者最近在开发过程中 需要进行时间上的处理的地方比较多 有时候没有处理好导致出现各种的错误 这里主要是讲一下 如何时将秒数的时间转化为 yyyy MM dd HH mm ss 的格式 例如 2016 12 04 16 40 23的
  • 全备份、增量备份与差量备份

    基本概念 全备份 做的一个完整备份 差量备份 以上一次的全备份为基本做的备份 增量备份 以上一次全备份或增量备份为基本做的备份 看了概念以后是不是还是一头雾水 呵呵 正常 不过没关系 下面会举例说明 如果版本库不是很大 直接做全备份就好了
  • python--打字练习的成绩判定

    题目 模拟打字练习程序 假设original为原始内容 user Inputs为用户输入的内容 要求 用户输入的内容长度不得大于原始内容长度 若对应位置字符一致 则认为正确 否则 判定输入错误 最后成绩为 正确的字符数量 原始字符串长度 按
  • Jsoup解析Html获取内容

    在做自己的博客时遇到问题 文章列表需要文章内容的第一段作为列表的内容展示 但是编辑采用的是富文本编辑器 内容为html格式 这是上网搜到Jsoup可以解析html 希望能帮到需要的小伙陪 p span style font size 6 3
  • msvcr110.dll丢失的解决方法哪种好,推荐这个4种解决方法

    Msvcr110 dll是Microsoft Visual Studio 2012的运行时组件之一 这个DLL文件包含一些用于Windows操作系统的C 函数库 当程序需要这些函数时 它们会被加载到内存中 以便程序可以使用它们 当计算机提示
  • 程序员挣够了钱,到中年失业真的很可怕吗?

    最近一刷知乎全部都是大龄程序员失业危机 真的有这么可怕吗 程序员35岁就真的到了瓶颈期 我不这么认为 挣够了钱 当然不可怕 问题是没挣够啊 按题主的算法是 大城市薪资1w以上 45岁失业 工作20年可以挣够钱 那我们现在来算一下 20年12
  • 《HarmonyOS物联网应用开发》课程上线

    讲师简介 51CTO的学员们 大家好 我是51CTO学院的新晋讲师许思维 目前就职于江苏润和软件股份有限公司 任高级软件工程师一职 同时也是企业内训讲师 我擅长的领域包括Linux系统编程 单片机编程 以及Android App和Andro
  • multiple definition of `qMain(int, char**)'错误该怎么处理!

    原因 在 pro文件中重复使用了一些文件
  • ECMAScript5,6,7从基本语法到高级函数

    尚硅谷ES5 6 7教程 01 尚硅谷 ECMAScript入门介绍 01 尚硅谷 ECMAScript入门介绍
  • 下载chromium源码执行 generate_location_tags.py错误returned non-zero exit status 1

    今天下载chromium 碰到这个错误 以前也下载过 都很顺利 Error Command python3 src testing generate location tags py out src testing location tag
  • SVD分解的并行实现

    在之前的文章中 我对SVD进行了大致的了解 它在互联网高端领域中有广泛的应用 至于它的一些详细应 用以后再进一步学习 现在主要的问题是如何有效地实现SVD分解 接下来我会先用两种方法来实现SVD分 解 即基于双边Jacobi旋转的SVD和基