A simple C++ stdlib-based complex & real matrix library, with matrix inversion, left division (A\b) and determinant calculation.
这是一个使用 C++ 标准库实现的简易复数及实数矩阵库,包含求逆矩阵、反斜杠除法 (A\b) 及行列式计算。
- Designed for users who don't want to use large linear algebra libs.
- Only used C++ standard library, easy to learn and modify (Each file less than 600 lines).
- Header files only, separated complex and real matrix library.
- No recursive algorithm (using LU and Cholesky decomposition). Reliable for 1000 x 1000 and larger matrices.
- 如果你不想使用大型线性代数库来计算这些,那你来对地方了。(什么,你只是想交作业?)
- 仅使用C++标准库,无论是学习思维还是修改都很简单(每份代码都少于600行)。
- 仅使用头文件即可,复数和实数矩阵库是分开的。
- 没有递归运算(基于 LU 和 Cholesky 分解)。可对1000x1000及更大的矩阵使用。
- rank: Matrix rank (Cholesky decomposition)
- det: Matrix determinant calculation
- inv: LU decomposition-based matrix inversion
- pinv: pinv(G) = inv(G' * G) * G' (WARNING: full-rank matrix only!)
- pinv2: Moore-Penrose pseudoinversion (same as pinv(G) in MATLAB)
- leftDiv: x = A \ b, using Moore-Penrose pinv, NOT same as MATLAB for a singular matrix
- rank: 计算矩阵秩 (Cholesky 分解)
- det: 计算矩阵行列式
- inv: 求逆矩阵,基于 LU 分解
- pinv: 经典伪逆,pinv(G) = inv(G' * G) * G' (警告:只能用于满秩矩阵!)
- pinv2: Moore-Penrose 伪逆 (与 MATLAB 中的 pinv(G) 相同)
- leftDiv: 反斜杠除法 x = A \ b, 使用 Moore-Penrose 伪逆, 对奇异矩阵的处理与 MATLAB 不同
#include "matBasic_complex.hpp"
int main(int argc, char **argv)
{
i_complex_matrix matA = {
{{1.0, 0.0}, {0.0, 1.0}, {4.0, 0.0}},
{{0.0, 5.0}, {1.0, 0.0}, {4.0, 0.0}},
{{8.0, 0.0}, {1.0, 1.0}, {0.0, 0.0}}};
showMatrix(matA, "A");
std::cout << "rank(A) = " << rank(matA) << "\n";
std::cout << "det(A) = " << det(matA) << "\n";
showMatrix(inv(matA), "inv(A)");
showMatrix(pinv(matA), "pinv(A)");
showMatrix(pinv2(matA), "pinv2(A)");
i_complex_matrix matb = {
{{1.0, 0.0}},
{{1.0, 2.0}},
{{0.0, 3.0}}};
showMatrix(matb, "b");
showMatrix(leftDiv(matA, matb), "A \\ b");
showMatrix(matMul(inv(matA), matb), "inv(A) * b");
showMatrix(matMul(pinv(matA), matb), "pinv(A) * b");
showMatrix(matMul(pinv2(matA), matb), "pinv2(A) * b (== A \\ b)");
std::cin.get();
return 0;
}
A : 3 x 3 Complex Matrix:
row[1]: 1, 0+1i, 4;
row[2]: 0+5i, 1, 4;
row[3]: 8, 1+1i, 0;
rank(A) = 3
det(A) = (-56,48)
inv(A) : 3 x 3 Complex Matrix:
row[1]: 0.00588235+0.0764706i, -0.00588235-0.0764706i, 0.0764706-0.00588235i;
row[2]: -0.329412-0.282353i, 0.329412+0.282353i, 0.217647-0.170588i;
row[3]: 0.177941+0.0632353i, 0.0720588-0.0632353i, -0.0617647-0.0529412i;
pinv(A) : 3 x 3 Complex Matrix:
row[1]: 0.00588235+0.0764706i, -0.00588235-0.0764706i, 0.0764706-0.00588235i;
row[2]: -0.329412-0.282353i, 0.329412+0.282353i, 0.217647-0.170588i;
row[3]: 0.177941+0.0632353i, 0.0720588-0.0632353i, -0.0617647-0.0529412i;
pinv2(A) : 3 x 3 Complex Matrix:
row[1]: 0.00588235+0.0764706i, -0.00588235-0.0764706i, 0.0764706-0.00588235i;
row[2]: -0.329412-0.282353i, 0.329412+0.282353i, 0.217647-0.170588i;
row[3]: 0.177941+0.0632353i, 0.0720588-0.0632353i, -0.0617647-0.0529412i;
b : 3 x 1 Complex Matrix:
row[1]: 1;
row[2]: 1+2i;
row[3]: 0+3i;
A \ b : 3 x 1 Complex Matrix:
row[1]: 0.170588+0.217647i;
row[2]: -0.0529412+1.31176i;
row[3]: 0.535294-0.0411765i;
inv(A) * b : 3 x 1 Complex Matrix:
row[1]: 0.170588+0.217647i;
row[2]: -0.0529412+1.31176i;
row[3]: 0.535294-0.0411765i;
pinv(A) * b : 3 x 1 Complex Matrix:
row[1]: 0.170588+0.217647i;
row[2]: -0.0529412+1.31176i;
row[3]: 0.535294-0.0411765i;
pinv2(A) * b (== A \ b) : 3 x 1 Complex Matrix:
row[1]: 0.170588+0.217647i;
row[2]: -0.0529412+1.31176i;
row[3]: 0.535294-0.0411765i;
- Pierre Courrieu, Fast Computation of Moore-Penrose Inverse Matrices, https://arxiv.org/abs/0804.4809
- Permute Sign Calculation, page5 https://www.math.rutgers.edu/docman-lister/math-main/academics/course-materials/250/assignments/1493-250c-lab3-sakai-pdf/file
- LU Decomposition C++ Implementation, https://blog.csdn.net/xx_123_1_rj/article/details/39553809
- LU Decomposition, https://www.math.ucdavis.edu/~linear/old/notes11.pdf
*** Project by Fanseline in Ericsson ***