MKL库奇异值分解(LAPACKE_dgesvd)
对任意一个\(m\times n\)的实矩阵,总可以按照SVD算法对其进行分解。即:
\]
其中\(U、V\)分别为\(m\times m、n\times n\)的方阵,由\(A\)的左奇异向量和右奇异向量组成,且\(U\)与\(V\)均为正交阵。\(\Sigma\)为\(m\times n\)的对角矩阵,对角线上的元素为矩阵\(A\)的奇异值。
在MKL库中求解奇异值和奇异向量的函数为LAPACKE_dgesvd。
1 参数详解
lapack_int LAPACKE_dgesvd(
matrix_layout, // (input)行优先(LAPACK_ROW_MAJOR)或列优先(LAPACK_COL_MAJOR)
jobu, // (input)计算矩阵U的全部或部分并返回。
/*"A":返回U的所有M列到U,
"S":返回U的前min(m,n)列到U,
"O":返回U的前min(m,n)列到A矩阵(覆盖),
"N":不计算矩阵U*/
jobvt, // (input)计算矩阵VT的全部或部分并返回;选项列表与jobu相同;
m, // (input)A矩阵的行,m>=0
n, // (input)A矩阵的列,n>=0
a, // (input/output)A矩阵
lda, // (input)A矩阵的第一维大小
s, // (output)A矩阵的奇异值,并按照从大到小的顺序排列
u, // (output) 矩阵U元素的一维数组
ldu, // (input) U矩阵的第一维大小
vt, // (output) 矩阵VT元素的一维数组
ldvt, // (input) VT矩阵的第一维大小
superb, // (output)工作空间
)
2 定义待处理矩阵
#include <stdlib.h>
#include <stdio.h>
#include "mkl_lapacke.h"
#define min(a,b) ((a)>(b)?(b):(a))
// 矩阵维度参数
#define M 6
#define N 5
#define LDA N
#define LDU M
#define LDVT N
// 声明需要的参数
MKL_INT m = M, n = N, lda = LDA, ldu = LDU, ldvt = LDVT, info;
double superb[min(M,N)-1];
double s[N], u[LDU*M], vt[LDVT*N]; //声明奇异值与奇异向量
double a[LDA*M] = { //定义待分解的A矩阵
8.79, 9.93, 9.83, 5.45, 3.16,
6.11, 6.91, 5.04, -0.27, 7.98,
-9.15, -7.93, 4.86, 4.85, 3.01,
9.57, 1.64, 8.83, 0.74, 5.80,
-3.49, 4.02, 9.80, 10.00, 4.27,
9.84, 0.15, -8.99, -6.02, -5.31
};
3 执行SVD分解
LAPACKE_dgesvd(LAPACK_ROW_MAJOR, 'A', 'A', m, n, a, lda, s, u, ldu, vt, ldvt, superb);
结果如图:
完整代码
#include <stdlib.h>
#include <stdio.h>
#include "mkl_lapacke.h"
#define min(a,b) ((a)>(b)?(b):(a))
// 展示奇异向量
extern void print_matrix(const char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda);
#define M 6
#define N 5
#define LDA N
#define LDU M
#define LDVT N
int main() {
//声明、定义输入
MKL_INT m = M, n = N, lda = LDA, ldu = LDU, ldvt = LDVT, info;
double superb[min(M, N) - 1];
double s[N], u[LDU * M], vt[LDVT * N];
double a[LDA * M] = {
8.79, 9.93, 9.83, 5.45, 3.16,
6.11, 6.91, 5.04, -0.27, 7.98,
-9.15, -7.93, 4.86, 4.85, 3.01,
9.57, 1.64, 8.83, 0.74, 5.80,
-3.49, 4.02, 9.80, 10.00, 4.27,
9.84, 0.15, -8.99, -6.02, -5.31
};
printf("LAPACKE_dgesvd (row-major, high-level) Example Program Results\n");
//计算SVD
info = LAPACKE_dgesvd(LAPACK_ROW_MAJOR, 'A', 'A', m, n, a, lda,
s, u, ldu, vt, ldvt, superb);
if (info > 0) {
printf("The algorithm computing SVD failed to converge.\n");
exit(1);
}
//奇异值
print_matrix("Singular values", 1, n, s, 1);
//左奇异向量
print_matrix("Left singular vectors (stored columnwise)", m, n, u, ldu);
//右奇异向量
print_matrix("Right singular vectors (stored rowwise)", n, n, vt, ldvt);
exit(0);
}
void print_matrix(const char* desc, MKL_INT m, MKL_INT n, double* a, MKL_INT lda) {
MKL_INT i, j;
printf("\n %s\n", desc);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) printf(" %6.2f", a[i * lda + j]);
printf("\n");
}
}
补充:SVD分解求逆
由之前的介绍,对于任意的实数矩阵\(A\),可以进行SVD分解:
\]
其中,\(U\)、\(V^T\)为正交矩阵,\(\Sigma\)为对角矩阵。若\(A\)矩阵可逆,易得
\]
即当使用LAPACKE_dgesvd,将矩阵\(A\)分解出三部分后,再经过简单的转置、对角阵求逆,最后通过LAPACKE_dgemm完成各矩阵相乘即可得到\(A\)的逆矩阵。
MKL库奇异值分解(LAPACKE_dgesvd)的更多相关文章
- [转]Numpy使用MKL库提升计算性能
from:http://unifius.wordpress.com.cn/archives/5 系统:Gentoo Linux (64bit, Kernel 3.7.1)配置:Intel(R) Cor ...
- 如何在 code blocks中使用 mkl库
为了安装caffe, 所以安装了mkl, 现在想在codeblock的项目中使用mkl. 设置mkl环境变量: mkl安装好后默认是在/opt/intel/mkl中,其中/opt/intel/mkl/ ...
- MKL库矩阵乘法
此示例是利用Intel 的MKL库函数计算矩阵的乘法,目标为:\(C=\alpha*A*B+\beta*C\),由函数cblas_dgemm实现: 其中\(A\)为\(m\times k\)维矩阵,\ ...
- 科学计算库(BLAS,LAPACK,MKL,EIGEN)
函数库接口标准:BLAS (Basic Linear Algebra Subprograms)和LAPACK (Linear Algebra PACKage) 1979年,Netlib首先用Fortr ...
- 64位Win7下安装并配置Python3的深度学习库:Theano
注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) 这两天在安装Python的深度学习库:Theano.尝试了好多遍,CMake.MinGW ...
- Linux C/C++ 链接选项之静态库--whole-archive,--no-whole-archive和--start-group, --end-group
参照这两篇博客: http://stackoverflow.com/questions/805555/ld-linker-question-the-whole-archive-option http: ...
- MKL与VS2019配置方法
VS2019配置oneAPI并调用MKL库 oneAPI oneAPI是一个跨架构的编程工具,旨在简化跨GPU.CPU.FPGA和AI加速器之间的编程,可以与英特尔自身设备,或其他厂商的芯片配合使用, ...
- Microsoft+R:Microsoft R Open (MRO)安装和多核运作
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 本文转载于公众号大猫的R语言课堂,公众号作者使 ...
- Caffe + Ubuntu 14.04 64bit + 无CUDA(linux下安装caffe(无cuda)以及python接口)
安装Caffe指导书 环境: Linux 64位 显卡为Intel + AMD,非英伟达显卡 无GPU 一. 安装准备工作 1. 以管理员身份登录 在左上角点击图标,搜索terminal(即终端),以 ...
随机推荐
- 面试问题之C++语言:类模板声明与定义为何不能分开
C++中每个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的.只有模板被真正使用的时候,编译器才知道,模板 ...
- ThreadLocal 是什么?有什么用?
ThreadLocal 是一个本地线程副本变量工具类.主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的 ...
- MySQL 支持事务吗?
在缺省模式下,MySQL 是 autocommit 模式的,所有的数据库更新操作都会即时 提交,所以在缺省情况下,MySQL 是不支持事务的. 但是如果你的 MySQL 表类型是使用 InnoDB T ...
- synchronized的原理
synchronized的使用 synchronized是一个java中的关键字,是基于JVM层面的,用于保证java的多线程安全,它具有四大特性,可用于完全替代volatile: 原子性:所谓原子性 ...
- 如何将springboot工程打包成war包并且启动
将项目打成war包,放入tomcat 的webapps目录下面,启动tomcat,即 可访问. 1.pom.xml配置修改 <packaging>jar</packaging> ...
- 顺利通过EMC实验(13)
- 2015 年十佳 HTML5 应用
前言 优秀的前端工程师戴着脚铐跳舞,究竟能把 HTML5 的体验推进到什么程度? 这些 Web apps 是我们运营云集浏览器的网上应用店一年来,我选出的十佳 Web apps.其中参考了同事们的意见 ...
- HTML5摇一摇(上)—如何判断设备摇动
刚刚过去的一年里基于微信的H5营销可谓是十分火爆,通过转发朋友圈带来的病毒式传播效果相信大家都不太陌生吧,刚好最近农历新年将至,我就拿一个"摇签"的小例子来谈一谈HTML5中如何调 ...
- JavaScript の 内容属性(HTML属性attribute)和 DOM 属性(property)
[博文]内容属性(HTML属性)和 DOM 属性 标签: 博文 JavaScript 粗略解读(与jQuery做对比) 内容属性(HTML属性) : attribute DOM 属性(Element属 ...
- 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...