Ubuntu下C++基于eigen库SVD矩阵奇异值分解效率分析

326 篇文章 2 订阅
36 篇文章 0 订阅

在优化求解问题中,经常要用到矩阵奇异值的SVD分解。

奇异值分解 (singularvalue decomposition,SVD)是一种可靠地正交矩阵分解法,它比QR分解法要花上近十倍的计算时间。

使用SVD分解法的用途是解最小平方误差法和数据压缩。


在Ubuntu下基于eigen C++库测试了eigen SVD算法的性能,即SVD求解最小二乘/伪逆,代码如下:

//compile: g++ test_svd.cpp
#include <iostream>
#include <Eigen/Dense>
#include <sys/time.h>      

using namespace std;
using namespace Eigen;

long getCurrentTime()    
{    
   struct timeval tv;    
   gettimeofday(&tv, NULL);    
   return tv.tv_sec * 1000 + tv.tv_usec / 1000;    
}    

int main()
{
	for(int i = 1; i < 5; i++) {
		cout << "A[5000, " << i * 20 << "]X=b" << endl;
		long t1 = getCurrentTime();
		MatrixXf A = MatrixXf::Random(5000, 20 * i);
		//cout << "A矩阵:\n" << A << endl;
		VectorXf b = VectorXf::Random(5000);
		//cout << "右侧b向量:\n" << b << endl;
		//cout << "最小均方值为:\n" << 
		A.jacobiSvd(ComputeThinU | ComputeThinV).solve(b);
		long t2 = getCurrentTime();
		cout << t2 - t1 << endl;
	}
	return 0;
}

运行结果:

A[5000, 20]X=b
186
A[5000, 40]X=b
702
A[5000, 60]X=b
1573
A[5000, 80]X=b
2805






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值