This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
#pragma once
#include "Defines.h"
#include "iAlgMath_global.h"
// SVD算法通常涉及到复杂的数学和数值分析技术。
// 本类实现了简化Jacobi迭代SVD算法的框架,它适用于任意大小的矩阵。
// 并在此基础上实现矩阵求逆(非方矩阵求逆问题)。
// 请注意,这个算法可能需要很多迭代才能收敛,并且没有进行优化以处理数值稳定性问题。
// 如果矩阵较大,本类不一定合适。
class I_ALGMATH_EXPORT zxAlgSVD
{
public:
zxAlgSVD();
~zxAlgSVD();
#ifdef QT_DEBUG
void test();
#endif
// 计算伪逆矩阵
VVecDouble pseudoInverse(VVecDouble& A);
private:
// svg
bool svd(VVecDouble& A);
// sqrt(a^2 + b^2) without under/overflow
double hypot(double a, double b);
// 缓存
VVecDouble U;
VVecDouble V;
VecDouble s;
int m;
int n;
};