【C++】pinv()函数原型以及matlab中的pinv() —— 8

article/2025/2/6 11:52:11

一、pinv()原型

函数形式:pinv(J, G, P);

核心算法:在这里插入图片描述

解释:G是正定矩阵,P是矩阵J的伪逆矩阵。当G为恒定常数时,以下等式成立:
在这里插入图片描述
函数原型:

template<typename DerivedA, typename DerivedB, typename DerivedC>
void pinv(const MatrixBase<DerivedA>& J, const MatrixBase<DerivedB>&G, MatrixBase<DerivedC>& P)
{MatrixXd J_temp(2, 2);J_temp = J.transpose()*G*J;P = (A_temp.inverse())*J.transpose()*G;
}

二、验证上述等式

直接上代码:

template<typename DerivedA, typename DerivedB, typename DerivedC>
void pinv(const MatrixBase<DerivedA>& A, const MatrixBase<DerivedB>&G, MatrixBase<DerivedC>& B)
{//这里就是在算这个投影矩阵p,最后的结果用B输出来,这里的A就是那个Γ,这里的G就是那个GMatrixXd A_temp(2, 2);A_temp = A.transpose()*G*A;B = (A_temp.inverse())*A.transpose()*G;}template<typename DerivedA, typename DerivedB>
void pinv2(const MatrixBase<DerivedA>& A, MatrixBase<DerivedB>& B) {MatrixXd A_temp(2, 2);A_temp = A.transpose()*A;B = (A_temp.inverse())*A.transpose();
}int main()
{Vector2d ratio;Matrix3d m_ratio;MatrixXd projection(2, 3);MatrixXd a(3, 2);	a<< 3,    0,88,   0,0,    1;pinv2(a, projection);// 求a的伪逆矩阵projectioncout << "projection = " << endl << projection << endl << endl;/*** 验证当G为任意常数时,pinv()等价于pinv2() **************************************/MatrixXd projection2(2, 3);Matrix2d G;G << 5, 005,;	pinv(a, G, projection2);cout << "projection2 = " << endl << projection2 << endl;
}

打印结果如下:
在这里插入图片描述
当我们改变G是值的时候,打印结果依然不变,可以证明:

当G为恒定常数时,
在这里插入图片描述

三、上述pinv()算法是否与Matlab中的pinv()函数一样?

思路:我们以求b矩阵的伪逆矩阵为例,看看与在Matlab中调用pinv()所得结果是否一致。

	b << 1, 2, 3,4, 5, 6,0, 0, 1;

(1)首先利用我们前面介绍的算法,看看结果如何:

int main()
{MatrixXd projection3(3, 3);MatrixXd projection4(3, 3);MatrixXd b(3, 3);	Matrix3d G;G<< 50, 00,050, 0,0, 0, 50;	b << 1, 2, 3,4, 5, 6,0, 0, 1;pinv2(b, projection3);pinv(b, G, projection4);cout << "projection3 = " << endl << projection3 << endl << endl;cout << "projection4 = " << endl << projection4 << endl;cout << "b.inverse() = " << endl << b.inverse() << endl;
}

我们顺便把b的逆矩阵也求出来了,结果为:
在这里插入图片描述
可以发现伪逆矩阵和逆矩阵结果是一样的。

(2)再看看在Matlab中的计算结果:
在这里插入图片描述
(3)结论

【1】可以发现Matlab计算出来的pinv(b)与前面的算法计算的结果一样。
所以,可以得出,我们写的pinv()函数与Matlab调用的pinv()是一样的。

【2】我们还可以发现,伪逆矩阵和逆矩阵也相同。有这样的一个结论:
当A矩阵是方阵,且可逆时,A的伪逆矩阵=A的逆矩阵。


http://chatgpt.dhexx.cn/article/5lLk8rw3.shtml

相关文章

python之numpy之伪逆numpy.linalg.pinv

文章目录 解释及实现笔记伪逆在最简单的线性回归中的应用 解释及实现 记 X X X的伪逆为 p i n v ( X ) pinv(X) pinv(X)&#xff0c;则有 p i n v ( X ) ( X T X ) − 1 X T pinv(X)(X^TX)^{-1}X^T pinv(X)(XTX)−1XT&#xff0c;容易发现 p i n v ( X ) X I pinv(X)XI pin…

【C++】Eigen介绍与使用 —— 4

一、Eigen介绍 Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C库&#xff0c;它里面包含了很多算法。它的License是MPL2。它支持多平台。Eigen采用源码的方式提供给用户使用&#xff0c;在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式&#xff0c;…

图像增强(1-灰度级变换)—内涵MATLAB源码

起篇三连问&#xff1a; 第一问&#xff1a;何为数字图像的增强&#xff1f; 个人理解&#xff0c;就是通过对图像进行平滑去噪、改变灰度级或者增强边缘&#xff0c;将我们想要的某些图像特征更明显的显现出来。这就是图像的增强&#xff0c;该过程重在对比度的拉伸。 第二问…

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

文章目录 一&#xff1a;图像增强概述二&#xff1a;基于灰度级变换的图像增强&#xff08;1&#xff09;线性灰度级变换A&#xff1a;基本线性灰度级变换B&#xff1a;分段线性灰度级变换①&#xff1a;定义②&#xff1a;截取式灰度变换③&#xff1a;窗切片 &#xff08;2&a…

图像处理:灰度(级)和分辨率

1、像素点 ​像素点是最小的图像单元&#xff0c;一张图片由好多的像素点组成。如下图 可以看到上述图片尺寸是500 * 338 的&#xff0c;表示图片是由一个500 * 338的像素点矩阵构成的&#xff0c;这张图片的宽度是500个像素点的长度&#xff0c;高度是338个像素点的长度&…

数字图像处理——灰度级分层

灰度级分层的两种基本形式如下&#xff1a; 一&#xff1a;将感兴趣的范围内的灰度值显示为一个值&#xff0c;而其他灰度值显示为另一个值 二&#xff1a;将感兴趣的范围内的灰度值变亮或变暗&#xff0c;而其他灰度值保持不变 Python实现过程如下&#xff1a; 使用的图像…

灰度级形态学 - 顶帽变换和底帽变换

目录 1. 介绍 2. 代码实现 1. 介绍 顶帽变换和底帽变换就是图像的加减和开闭运算的结合 顶帽变换的公式为&#xff1a;原图 - 原图的开运算 这里结合开运算的几何图形解释来介绍顶帽变换。 因为开运算是结构元从下往上推动的过程&#xff0c;所以会删除图像灰度值相对周围高…

图像处理基础——灰度级形态学

文章目录 简介膨胀 腐蚀腐蚀膨胀 开运算 闭运算一些基本的灰度级形态学算法形态学平滑形态学梯度顶帽变换 底帽变换 灰度级形态学重建 简介 形态学只适用于Region操作 或者是二值化后的图片 需要延伸到灰度形态学才能广泛应用 拓展到灰度级形态学后 结构元的表达形式可以大致分…

灰度图像分辨率变换(灰度级)

目的&#xff1a;&#xff08;1&#xff09;对一帧8bits 128x128的灰度图像处理为1bits和3bits的128x128灰度图像。 &#xff08;2&#xff09;处理为8bits 64x64和32x32的灰度图像。 一、基本原理 一幅图像的x和y坐标及幅度可能都是连续的。为了把它转换为数字形式&#x…

matlab-图形采样及灰度级转换

目录 一、图像采样 1、实验内容 2、采样原理 3、实验程序 4&#xff0e;实验结果与分析 5&#xff0e;思考题 二、图像类型转换 1、实验内容 2&#xff0e;实验原理 3、程序 4&#xff0e;实验结果与分析 5. 思考题 一、图像采样 1、实验内容 试对任意一幅图像分…

灰度级形态学

灰度级形态学 灰度级形态学知识点&#xff1a;1、灰度化和二值化2、灰度图像是几通道图像3、灰度图和二值图的区别&#xff1a;4、像素点灰度形态学梯度 形态学只适用于区域操作 或者是二值化后的图片. 灰度级形态学知识点&#xff1a; 在图像处理中&#xff0c;用RGB三个分量&…

灰度、灰度级、分辨率、像素值相关概念

灰度、灰度级、分辨率、像素值&#xff1b; 2017年09月18日 20:01:04 以梦为马_不负韶华 阅读数&#xff1a;14346 版权声明&#xff1a;版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/Strive_0902/article/details/78023…

转换为不同灰度级图像

将256级灰度图像转换为64级灰度图像、32级灰度图像等。 matlab代码: I imread(cameraman.tif); [m,n]size(I); Jzeros(m,n); for i1:mfor j1:nJ(i,j)floor(I(i,j)/32);end end Kuint8(J); subplot(131) imshow(I);title(原图);colorbar subplot(132) imshow(K,[0,7]);title(…

OpenCV黑白图像增强——灰度级切片

前言 在OpenCV中&#xff0c;在Mat中&#xff0c;表达图像的值是0到255&#xff0c;0为黑色&#xff0c;255为白色&#xff0c;而已灰度级切片对灰度图像做二值映射讲处理&#xff0c;给一个阈值&#xff0c;按这个阈值去分层&#xff0c;大于这个阈的赋一个值&#xff0c;小于…

数字图像处理学习笔记(二):图像灰度级的增加、减少

实验截图&#xff1a; 图像灰度级阶梯 实验代码&#xff1a; img1 imread(erciyuan.jpg); img2 rgb2gray(img1); for i0:7 img (uint8(img2/(2^i)))*(2^i); %灰度级逐渐递减的过程 subplot(2,4,i1), imshow(img,[]); title( [ ,num2str(2^(8-i)),级灰度图像]); %设置…

灰度级形态学 - 灰度膨胀和灰度腐蚀

目录 1. 介绍 2. code 1. 介绍 灰度级形态学将形态学在二值图像的处理中扩展到灰度图像 灰度腐蚀&#xff1a;得到kernel 处理子区域的最小值 因此&#xff1a;灰度腐蚀后的图像整体偏暗&#xff0c;并且亮特征减少 灰度膨胀&#xff1a;得到kernel 处理子区域的最大值 同…

图像处理名词解释之灰度、灰度级、分辨率、像素值总结

​ 1、像素点 ​像素点是最小的图像单元&#xff0c;一张图片由好多的像素点组成。如下图 可以看到上述图片尺寸是500 * 338 的&#xff0c;表示图片是由一个500 * 338的像素点矩阵构成的&#xff0c;这张图片的宽度是500个像素点的长度&#xff0c;高度是338个像素点的长度&am…

不同灰度级的图像

学习DIP第0天 更多细节参考&#xff1a;http://face2ai.com/DIP-1-1-不同灰度级的图像/ 结论一&#xff1a;对于细节较多的图像&#xff0c;当图像大小&#xff08;N&#xff09;不变的情况下&#xff0c;灰度级别对于感官质量相对独立&#xff1b; 解释&#xff1a;如果图像…

【OpenCV 例程200篇】41. 图像的灰度变换(灰度级分层)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】41. 图像的灰度变换&#xff08;灰度级分层&#xff09; 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 分段线性变换函数可以增强图像各部分的反差&#xff0c;增强感兴趣…

图像灰度级压缩

遥感图像灰度级压缩 在使用灰度共生矩阵计算图像纹理的时候,考虑到计算效率,需要对图像先进行灰度级压缩的操作,比较简单的方法是直接除以前后灰度级的倍数,结果发现这样处理效果不好,原因是影像的直方图分布可能极其不均匀,导致压缩后的图像像素值都集中在最小值周围。…