-
OpenCV-Python常用图像运算:加减乘除幂开方对数及位运算
2020-10-19 22:16:30本文详细介绍了OpenCV-Python图像的加减乘除幂开方对数及位运算相关的函数及语法,并总结了相关函数的作用。OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像...☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░
一、引言
在写该文之前,老猿就图像的一些运算已经单独边学边发了,在写这些文的过程中,发现这些运算函数共同点很多,例如大部分参数一样、部分处理方法一样等,另外还有些函数可以实现相同或近似的效果,因此在前面那些文章的基础上,将其综合为一个整体来发布,更方便大家阅读。
OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算和numpy矩阵运算还是有些不同。例如在加法处理上,OpenCV加法是饱和运算(超过255即按255),而Numpy加法是模运算(超过255按256取模的结果作为结果)。对加法来说,颜色值越大OpenCV 的结果会更好,因此推荐使用opencv的进行算术运算。本文的内容全部基于OpenCV的方法进行介绍。
二、OpenCV图像运算语法
2.1、图像运算函数列表
OpenCV图像运算包括如下函数:
- 加法运算:
add(src1, src2, dst=None, mask=None, dtype=None)
- 减法运算:
subtract(src1, src2, dst=None, mask=None, dtype=None)
- 乘法运算:
multiply(src1, src2, dst=None, scale=None, dtype=None)
- 除法运算:
divide(src1, src2, dst=None, scale=None, dtype=None)
- 幂运算:
pow(src, power, dst=None)
- 开方运算:
sqrt(src, dst=None)
- 自然常数e为底的指数函数:
exp(src, dst=None)
- 对数运算:
log(src, dst=None)
- 融合权重加法:
addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
- 位与运算:
bitwise_and(src1, src2, dst=None, mask=None)
- 位或运算:
bitwise_or(src1, src2, dst=None, mask=None)
- 位异或运算:
bitwise_xor(src1, src2, dst=None, mask=None)
- 位非运算:
bitwise_not(src, dst=None, mask=None)
2.2、图像运算常用参数说明
- src:输入图像矩阵
- src1、src2:两副大小和通道数相等的输入图像或一副输入图像和一个标量(关于标量请参考《OpenCV-Python中的标量Scalar是什么》)
- dst:目标图像输出,要求与输入图像大小相同,如果传值则可以直接以实参作为目标图像存储变量,否则可以用函数返回值作为目标图像存储变量,在实参非None传入的情况下,返回值与该实参值相同
- scale:缩放因子,图像运算时,先执行src1*scale,再以该乘积进行后续运算
- mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。更多关于掩膜的内容请参考《OpenCV学习02-矩阵的掩膜操作》或《Opencv图像处理之详解掩膜mask》
- dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。在帮助文档中介绍,参数src1和src2可以有不同的图像深度(即图像像素位数,如8位、16位、24位和32位),如可以将16位图像和一个8位图像相加将输出结果保存在32位输出数组中。关于这个参数老猿研究可很长时间,因为认为如果图像深度不一样,意味着图像的通道数也不一样,通道数不一样,意味着数组大小不一样,这样的两个数组无法进行运算。后来机缘契合下自认为理解了,这里说的图像深度不是通道数*8,而是单个通道值表示的位数,即单通道不一定是8位的,也可以是16位、24位或32位的。看如下代码就明白了:
def main(): img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32) img2 = cv2.imread(r'F:\pic\shape2.png') img = cv2.add(img1,img2,dtype=24)
上述代码将以两种不同表示方法读入两副图像,第一幅图像是以float32来表示图像单通道值,第二幅图像是缺省值uint8来表示图像单通道值,二者机器位数不同,但相加之后转为了24位图像,即单通道为8字节图像。
注:
上面介绍的dtype取值说明总体是对的,但dtype=24并不表示24位,具体含义请参考《OpenCV-Python图像像素位深表示法以及应用:https://blog.csdn.net/LaoYuanPython/article/details/109574736》。
2.3、部分图像运算函数详解
针对部分重要的图像运算,老猿在前面已经单独进行了介绍,包括:
- OpenCV-Python图像的加法运算cv2.add函数详解
- OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比
- OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理
- OpenCV-Python图像除法运算cv2.divide函数及图像相除处理
- OpenCV-Python图像融合cv2.addWeighted权重加法函数详解
- OpenCV-Python图像位与运算bitwise_and函数详解
2.4、其他图像运算函数简介
-
幂运算:
pow(src, power, dst=None)
,对图像的每个通道值计算power参数对应的幂作为结果图像的通道值,如果power为整数,则直接计算幂值,如果power为浮点数,则取通道值的绝对值参与计算,即: -
开方运算:
sqrt(src, dst=None)
,对图像的每个通道值开方作为结果图像的通道值,即:dst(I)=sqrt(src1(I))
-
自然常数e为底的指数函数:
exp(src, dst=None)
,以e为底对图像的每个通道值作为幂值计算结果图像的通道值,即: -
对数运算:
log(src, dst=None)
,计算图像的每个通道值的自然对数作为结果图像的通道值,即:dst(I)=ln(src(I))
-
位或运算:
bitwise_or(src1, src2, dst=None, mask=None)
,计算两副图像每个通道值或一图像通道值与一个标量的按位或的结果作为结果图像的通道值 -
位异或运算:
bitwise_xor(src1, src2, dst=None, mask=None)
,计算两副图像每个通道值或一图像通道值与一个标量的按位异或的结果作为结果图像的通道值 -
位非运算:
bitwise_not(src, dst=None, mask=None)
,将src图像的每个通道值按位取反作为结果图像的值。
三、相关函数的作用分析
- 图像的减法、除法以及异或都可以用于分析图像的差异点,但减法和异或更准确 ;
- 加法、权重加法以及图像或运算都可以用于合并图像,但由于运算方法与差异,效果会有不同,针对不同图像的融合选择哪种方法与图像数据及应用的目标相关;
- 图像的自乘、幂运算都可以用于调整图像的对比度;
- 非运算及异或运算可以将图像的一部分图像的视觉效果提高;
- 图像乘法、位与都可以用于提取图像的感兴趣部分或者屏蔽某些部分,在这方面的功能与图像掩码的效果相同,只是实现方式不同;
- 通过阈值处理、图像求反、与处理等可以提取图像中的结构特征
四、按位运算的简单案例
前面部分图像运算函数详解中举例介绍了图像加减乘除权重加及位与的相关功能,在此补充一个简单的按位运算的案例。代码如下:
import numpy as np import cv2 def main(): img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32) img2 = cv2.imread(r'F:\pic\shape2.png') resultImgAnd = cv2.bitwise_and(img1, img2) resultImgOr = cv2.bitwise_or(img1, img2) resultImgXor = cv2.bitwise_xor(img1, img2) resultImgNot = cv2.bitwise_not(img1) resultImgXorScalar = cv2.bitwise_xor(img1, (255,255,255,255)) cv2.imshow('img1',img1) cv2.imshow('img2', img2) cv2.imshow('resultImgAnd', resultImgAnd) cv2.imshow('resultImgOr', resultImgOr) cv2.imshow('resultImgXor', resultImgXor) cv2.imshow('resultImgNot', resultImgNot) cv2.imshow('resultImgXorScalar', resultImgXorScalar) cv2.waitKey(0) main()
运行显示的图片截屏:
五、小结
本文详细介绍了OpenCV-Python图像的加减乘除幂开方对数及位运算相关的函数及语法,并总结了相关函数的作用。OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算是饱和运算,其运算效果比纯粹的矩阵运算效果更好。
如果觉得本文可以给您带来帮助,请大家帮忙点个赞、加个收藏,谢谢!
更多OpenCV-Python介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html关于老猿的付费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。
付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.csdn.net/laoyuanpython/category_9831699.html)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学OpenCV!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
- 加法运算:
-
python开方运算符_OpenCV-Python常用图像运算:加减乘除幂开方对数及位运算
2020-12-08 21:36:38☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░一、引言在写该文之前,老猿就图像的一些运算已经单独边学边发了,在写这些文的过程中,发现这些运算函数共同点很多,例如大部分参数一样、部分...☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░
一、引言
在写该文之前,老猿就图像的一些运算已经单独边学边发了,在写这些文的过程中,发现这些运算函数共同点很多,例如大部分参数一样、部分处理方法一样等,另外还有些函数可以实现相同或近似的效果,因此在前面那些文章的基础上,将其综合为一个整体来发布,更方便大家阅读。
OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算和numpy矩阵运算还是有些不同。例如在加法处理上,OpenCV加法是饱和运算(超过255即按255),而Numpy加法是模运算(超过255按256取模的结果作为结果)。对加法来说,颜色值越大OpenCV 的结果会更好,因此推荐使用opencv的进行算术运算。本文的内容全部基于OpenCV的方法进行介绍。
二、OpenCV图像运算语法
2.1、图像运算函数列表
OpenCV图像运算包括如下函数:
加法运算:add(src1, src2, dst=None, mask=None, dtype=None)
减法运算:subtract(src1, src2, dst=None, mask=None, dtype=None)
乘法运算:multiply(src1, src2, dst=None, scale=None, dtype=None)
除法运算:divide(src1, src2, dst=None, scale=None, dtype=None)
幂运算:pow(src, power, dst=None)
开方运算:sqrt(src, dst=None)
自然常数e为底的指数函数:exp(src, dst=None)
对数运算:log(src, dst=None)
融合权重加法:addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
位与运算:bitwise_and(src1, src2, dst=None, mask=None)
位或运算:bitwise_or(src1, src2, dst=None, mask=None)
位异或运算:bitwise_xor(src1, src2, dst=None, mask=None)
位非运算:bitwise_not(src, dst=None, mask=None)
2.2、图像运算常用参数说明
src:输入图像矩阵
src1、src2:两副大小和通道数相等的输入图像或一副输入图像和一个标量(关于标量请参考《OpenCV-Python中的标量Scalar是什么》)
dst:目标图像输出,要求与输入图像大小相同,如果传值则可以直接以实参作为目标图像存储变量,否则可以用函数返回值作为目标图像存储变量,在实参非None传入的情况下,返回值与该实参值相同
scale:缩放因子,图像运算时,先执行src1*scale,再以该乘积进行后续运算
mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0。更多关于掩膜的内容请参考《OpenCV学习02-矩阵的掩膜操作》
dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。在帮助文档中介绍,参数src1和src2可以有不同的图像深度(即图像像素位数,如8位、16位、24位和32位),如可以将16位图像和一个8位图像相加将输出结果保存在32位输出数组中。关于这个参数老猿研究可很长时间,因为认为如果图像深度不一样,意味着图像的通道数也不一样,通道数不一样,意味着数组大小不一样,这样的两个数组无法进行运算。后来机缘契合下自认为理解了,这里说的图像深度不是通道数*8,而是单个通道值表示的位数,即单通道不一定是8位的,也可以是16位、24位或32位的。看如下代码就明白了:
def main():
img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
img2 = cv2.imread(r'F:\pic\shape2.png')
img = cv2.add(img1,img2,dtype=24)
上述代码将以两种不同表示方法读入两副图像,第一幅图像是以float32来表示图像单通道值,第二幅图像是缺省值uint8来表示图像单通道值,二者机器位数不同,但相加之后转为了24位图像,即单通道为8字节图像。
2.3、部分图像运算函数详解
针对部分重要的图像运算,老猿在前面已经单独进行了介绍,包括:
OpenCV-Python图像的加法运算cv2.add函数详解
OpenCV-Python图像的减法运算cv2.subtract函数详解以及和矩阵减法的差异对比
OpenCV-Python图像乘法运算cv2.multiply函数详解及像素值溢出归一化处理
OpenCV-Python图像除法运算cv2.divide函数及图像相除处理
OpenCV-Python图像融合cv2.addWeighted权重加法函数详解
OpenCV-Python图像位与运算bitwise_and函数详解
2.4、其他图像运算函数简介
幂运算:pow(src, power, dst=None),对图像的每个通道值计算power参数对应的幂作为结果图像的通道值,如果power为整数,则直接计算幂值,如果power为浮点数,则取通道值的绝对值参与计算,即:
开方运算:sqrt(src, dst=None),对图像的每个通道值开方作为结果图像的通道值,即:dst(I)=sqrt(src1(I))
自然常数e为底的指数函数:exp(src, dst=None),以e为底对图像的每个通道值作为幂值计算结果图像的通道值,即:
对数运算:log(src, dst=None),计算图像的每个通道值的自然对数作为结果图像的通道值,即:dst(I)=ln(src(I))
位或运算:bitwise_or(src1, src2, dst=None, mask=None),计算两副图像每个通道值或一图像通道值与一个标量的按位或的结果作为结果图像的通道值
位异或运算:bitwise_xor(src1, src2, dst=None, mask=None),计算两副图像每个通道值或一图像通道值与一个标量的按位异或的结果作为结果图像的通道值
位非运算:bitwise_not(src, dst=None, mask=None),将src图像的每个通道值按位取反作为结果图像的值。
三、相关函数的作用分析
图像的减法、除法以及异或都可以用于分析图像的差异点,但减法和异或更准确 ;
加法、权重加法以及图像或运算都可以用于合并图像,但由于运算方法与差异,效果会有不同,针对不同图像的融合选择哪种方法与图像数据及应用的目标相关;
图像的自乘、幂运算都可以用于调整图像的对比度;
非运算及异或运算可以将图像的一部分图像的视觉效果提高;
图像乘法、位与都可以用于提取图像的感兴趣部分或者屏蔽某些部分,在这方面的功能与图像掩码的效果相同,只是实现方式不同;
通过阈值处理、图像求反、与处理等可以提取图像中的结构特征
四、按位运算的简单案例
前面部分图像运算函数详解中举例介绍了图像加减乘除权重加及位与的相关功能,在此补充一个简单的按位运算的案例。代码如下:
import numpy as np
import cv2
def main():
img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
img2 = cv2.imread(r'F:\pic\shape2.png')
resultImgAnd = cv2.bitwise_and(img1, img2)
resultImgOr = cv2.bitwise_or(img1, img2)
resultImgXor = cv2.bitwise_xor(img1, img2)
resultImgNot = cv2.bitwise_not(img1)
resultImgXorScalar = cv2.bitwise_xor(img1, (255,255,255,255))
cv2.imshow('img1',img1)
cv2.imshow('img2', img2)
cv2.imshow('resultImgAnd', resultImgAnd)
cv2.imshow('resultImgOr', resultImgOr)
cv2.imshow('resultImgXor', resultImgXor)
cv2.imshow('resultImgNot', resultImgNot)
cv2.imshow('resultImgXorScalar', resultImgXorScalar)
cv2.waitKey(0)
main()
运行显示的图片截屏:
五、小结
本文详细介绍了OpenCV-Python图像的加减乘除幂开方对数及位运算相关的函数及语法,并总结了相关函数的作用。OpenCV中图像存储为矩阵,因此图像的运算其实就是矩阵的运算。图像的运算主要包括图像基础算术运算、图像加权运算(又称为图像融合)、按位运算等类别。这些运算可以直接通过numpy矩阵进行,也可以通过opencv的专用方法进行,但opencv的矩阵运算是饱和运算,其运算效果比纯粹的矩阵运算效果更好。
更多OpenCV-Python介绍请参考专栏《OpenCV-Python图形图像处理 》
专栏网址:https://blog.csdn.net/laoyuanpython/category_9979286.html
关于老猿的付费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。
付费专栏文章目录:《moviepy音视频开发专栏文章目录》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt开发图形界面Python应用专栏目录 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》(https://blog.csdn.net/laoyuanpython/category_9831699.html)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学OpenCV!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
-
复数的函数基本运算(加,减,乘,除,对数,指数,幂,三角,反三角,双曲线)
2020-12-23 14:18:27在之后的项目中有编写复数函数的要求,所以先总结资料以备用。同时也发布在这里以供大家参考。在之后的项目中有编写复数函数的要求,所以先总结资料以备用。同时也发布在这里以供大家参考。
复数的加法运算
(a+bi)+(c+di)=(a+c)+(b+d)i
复数的减法运算
(a+bi)+(c+di)=(a-c)+(b-d)i
复数的乘法运算
(a+bi)(c+di)=(ac-bd)+(bc+ad)i
复数的除法运算
(a+bi)/(c+di)
=(ac + bd)/(c^2 + d ^2) +((bc - ad)/(c ^2 + d ^2)) i复数的指数运算
复数的log运算
(1)tan^(-1) 是指tan的倒数,这里上标的-1是指数幂,即tan^(-1)=1/tan;如果是函数f(x) = tan⁻¹(x),上标的-1是函数幂,就表示是tan的反函数,相当于就是arctan(x)。
(2)cot是三角函数里的余切三角函数符号,cotθ=1/tanθ=tanθ^(-1);当θ=kπ,k∈Z时,cotθ不存在。
(3)arctan指反正切函数,反正切函数是反三角函数的一种,是正切函数tan的反函数。对于以其它数为底的对数,可以使用换底公式:
复数的幂运算
复数的幂运算单独进行,比较复杂。可以在指数运算和对数运算的基础上进一步进行。
求复数的cos函数值
由 cos(a+b) = cosacosb - sinasinb 得
cos(a+bi) = cosacos(bi) - sinasin(bi)
又
sinh x = -i sin(i * x)
cosh x = cos(i * x)
tanh x = -i tan(ix)
coth x = i cot(i * x)
sech x = sec(i * x)
csch x = i csc(i * x)
所以
cos(a+bi)
= cosacos(bi) - sinasin(bi)
= cosacoshb + [sina*sinhb] i求复数的sin函数值
由 sin(a+b) = sinacosb + cosasinb 得
sin(a+bi) = sinacos(bi) + cosasin(bi)
又
sinh x = -i sin(i * x)
cosh x = cos(i * x)
tanh x = -i tan(ix)
coth x = i cot(i * x)
sech x = sec(i * x)
csch x = i csc(i * x)
所以
sin(a+bi)
= sinacos(bi) + cosasin(bi)
= sinacoshb - [cosa*sinhb] i也可以使用此公式,在指数运算的基础上进行。
复数的n次开方运算
任意复数表示成 z = a + bi
若 a = ρcosθ, b = ρsinθ, 即可将复数在一个平面上表示成一个向量, ρ为向量长度(复数中称为模),θ为向量角度(复数中称为辐角)
即 z = ρcosθ + ρsinθ, 由欧拉公式得 z = ρe^(iθ)
注意到向量角度, cos(2kπ+θ) = cosθ, sin(2kπ+θ) = sinθ
所以 z = ρe^ (iθ) = ρe^[i(2kπ+θ)
开n次方,z^ (1/n )= ρ^ (1/n) * e^ [i(2kπ+θ)/n]
k=0,1,2,3……n-1,n,n+1……
k=n时,易知和k=0时取值相同
k=n+1时,易知和k=1时取值相同故总共n个根,复数开n次方有n个根
故复数开方公式
先把复数转化成下面形式
z = ρcosθ + ρsinθ = ρe^[i(2kπ+θ)
z^ (1/n) = ρ^ (1/n) * e^ [i(2kπ + θ)/n]
k取0到n-1。然后再通过指数运算求值。
复数的反三角函数运算
复数的双曲函数运算
根据转换,转换成复数的指数运算。初次撰写博客,多有瑕疵敬请指教。
-
复数与复变函数基本运算(加,减,乘,除,exp,log,sin,cos,幂运算)
2019-05-01 18:07:05(这将是百度上关于复数运算较为全面的一篇) 加法 (a+bi)+(c+di)=(a+c)+(b+d)i 减法 (a+bi)+(c+di)=(a-c)+(b-d)i 乘法 (a+bi)(c+di)=(ac-bd)+(bc+ad)i 除法 (a+bi)/(c+di)=(ac+bd)/(c ^ 2 + d...运算公式
(这将是百度上关于复数运算较为全面的一篇)
加法
-
(a+bi)+(c+di)=(a+c)+(b+d)i
减法
-
(a+bi)+(c+di)=(a-c)+(b-d)i
乘法
-
(a+bi)(c+di)=(ac-bd)+(bc+ad)i
除法
-
(a+bi)/(c+di)=(ac+bd)/(c ^ 2 + d ^ 2) +((bc-ad)/(c ^ 2 + d ^ 2)) i
exp
log
对于其它对数计算可使用换低公式:
sin & cos
幂
结果检验
代码
(注意参数可能为空指针,由于使用浮点数作为基础数据类型,对于复数为零的判断要设置一个阈值,这里使用了10倍的Double最小值)
package complex; import java.util.Objects; public class Complex { private double re; //real private double im; //imaginary static final Complex I=new Complex(0,1); static final Complex NI=new Complex(0,-1); public Complex(double real, double imag) { re = real; im = imag; } public static Complex add(Complex a,Complex b) { Objects.requireNonNull(a); Objects.requireNonNull(b); return new Complex(a.re + b.re,a.im + b.im); } public static Complex sub(Complex a,Complex b) { Objects.requireNonNull(a); Objects.requireNonNull(b); return new Complex(a.re - b.re,a.im - b.im); } public static Complex mul(Complex a,Complex b) { Objects.requireNonNull(b); Objects.requireNonNull(b); double real = a.re * b.re - a.im * b.im; double imag = a.re * b.im + a.im * b.re; return new Complex(real,imag); } public static Complex div(Complex a,Complex b) { Objects.requireNonNull(b); Objects.requireNonNull(b); if(b.isZero()) { throw new ArithmeticException("/ by zero"); } double den=b.re * b.re + b.im * b.im; double real = a.re * b.re + a.im * b.im; double imag = a.im * b.re - a.re * b.im; return new Complex(real/den, imag/den); } public static Complex log(Complex com) { double real = com.re * com.re + com.im * com.im; double imag = Math.atan(com.im * com.re ); return new Complex(Math.log(real)/2,imag); } public static Complex exp(Complex com) { double real = Math.cos(com.im); double imag = Math.sin(com.im); double expx= Math.exp(com.re); return new Complex(expx*real,expx*imag); } public static Complex sin(Complex com) { final Complex cf=new Complex(0,2);//coefficient Complex e1=exp(mul(I,com)); Complex e2=exp(mul(NI,com)); return div(sub(e1,e2),cf); } public static Complex cos(Complex com) { final Complex cf=new Complex(0,2);//coefficient Complex e1=exp(mul(I,com)); Complex e2=exp(mul(NI,com)); return div(add(e1,e2),cf); } public static Complex pow(Complex a,Complex b) {; return Complex.exp( Complex.mul(b, Complex.log(a))); } public boolean isZero() { if(Math.abs(re)<10*Double.MIN_VALUE &&Math.abs(im)<10*Double.MIN_VALUE) { return true; } return false; } public Complex conjugate() { return new Complex(re,-im); } public double length() { return Math.sqrt(re * re + im * im); } public String toString() { if(im<0) return "( "+re+im+"i )"; return "( "+re+"+"+im+"i )"; } }
测试数据
public static void main(String[] args) { Complex a=new Complex(1,2); Complex b=new Complex(0,1); System.out.println("add "+a+" + " +b +" = "+add(a,b)); System.out.println("sub "+a+" - " +b +" = "+sub(a,b)); System.out.println("mul "+a+" * " +b +" = "+mul(a,b)); System.out.println("div "+a+" / " +b +" = "+div(a,b)); Complex lg=new Complex(1,1); System.out.println("log "+lg+" = "+log(lg)); System.out.println("value :"+0.5*Math.log(2)+" "+Math.PI/4+"i"); Complex ex=new Complex(2,1); System.out.println("exp "+ex+" = "+exp(ex)); System.out.println("value :"+(Math.exp(2)*Math.cos(1))+" "+(Math.exp(2)*Math.sin(1))+"i"); Complex sinc=new Complex(0,1); System.out.println("sin "+sinc+" = "+sin(sinc)); System.out.println("value :"+0+" "+(Math.exp(1)-Math.exp(-1))/2+"i"); Complex cosc=new Complex(0,1); System.out.println("cos "+sinc+" = "+cos(cosc)); System.out.println("value :"+0+" "+(Math.exp(1)+Math.exp(-1))/2+"i"); Complex p1=new Complex(1,1); Complex p2=new Complex(0,1); System.out.println("pow "+p1+","+p2 +" = "+pow(p1,p2)); System.out.println("value :"+0.428829006+" "+0.154871752+"i"); }
add ( 1.0+2.0i ) + ( 0.0+1.0i ) = ( 1.0+3.0i )
sub ( 1.0+2.0i ) - ( 0.0+1.0i ) = ( 1.0+1.0i )
mul ( 1.0+2.0i ) * ( 0.0+1.0i ) = ( -2.0+1.0i )
div ( 1.0+2.0i ) / ( 0.0+1.0i ) = ( 2.0-1.0i )
log ( 1.0+1.0i ) = ( 0.34657359027997264+0.7853981633974483i )
value :0.34657359027997264 0.7853981633974483i
exp ( 2.0+1.0i ) = ( 3.992324048441272+6.217676312367968i )
value :3.992324048441272 6.217676312367968i
sin ( 0.0+1.0i ) = ( 0.0+1.1752011936438014i )
value :0 1.1752011936438014i
cos ( 0.0+1.0i ) = ( 0.0-1.5430806348152437i )
value :0 1.5430806348152437i
pow ( 1.0+1.0i ),( 0.0+1.0i ) = ( 0.4288290062943678+0.15487175246424675i )
value :0.428829006 0.154871752i -
-
实现位数超过32bit的整数的加减乘除运算_Java 运算符
2020-11-29 05:23:56运算符基础运算符比较常规 + - * / 代表加减乘除,以及整数的求余用 % 来表示需要注意的是整数被 0 除将会产生一个异常, 浮点数被 0 除会得到无穷大 或 NaN数学函数与常量Math 类包含各种数学函数 比如求一个数值的... -
php 加减函数
2018-07-20 16:04:26默认保留两位小数 bcadd(参数1,参数2,参数3) 参数1 和2 是要相加的参数 3是保留几位小数。 1. bcadd 任意精度数的相加 ...5. bcpow 幂函数运算 6. bcsqrt 平方根 7. sqrt 平方根运算 7. pow求幂 8. abs ... -
利用栈实现加减乘除幂功能
2016-04-09 14:59:10如何用栈来实现加减乘除幂的运算呢?应考虑下面几点。 1.分别用一个栈x存符号,另一个栈y存数值。 2.遇到数字就压栈,遇到符号ch要比较栈顶的符号与当前的符号ch,编写一个判别函数prev,若能进行运算,则返回真,... -
不用加减运算符做加法 4 的幂 7进制数
2021-02-06 22:44:41写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。 class Solution { public int add(int a, int b) { int c ; int d; while(b!=0){ c=a^b; d=(a&b)<<... -
js实现精准运算——加减乘除
2019-11-01 11:33:30主要思路是先取到小数部分的位数,再通过去掉小数点的方式将小数转化为整数进行除法运算,最后再用计算结果乘以10的小数差的次幂倍 //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两... -
python计算函数_Python 的基本运算和内置函数
2020-12-03 07:34:06a=10,b=20:运算符描述实例+加 - 两个对象相加a + b 输出结果 30-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200/除 - x除以yb / a ... -
函数及运算
2017-02-27 15:53:10+:加, -:减, *:乘, /: 除, \:左除 ^: 幂,‘:复数的共轭转置, ():制定运算顺序。 2、常用函数表: sin( ) 正弦(变量为弧度) Cot( ) 余切(变量为弧度) sind( ) 正弦(变量为度数... -
大数高精度(加减乘除,取余,幂次)kuangbin模板C++实现
2019-09-17 16:48:10给一个例题吧:求卡特兰数 ...主要要学会使用模板中的各种运算函数。有注释,其实就是一个模拟的过程,大家自己看,应该比较易懂(感谢 kuangbin 大神) #include <iostream> #include <cstdio> #includ... -
js函数式编程术语之幂等性 Idempotent
2019-01-11 14:43:22如四则运算的加、减、乘、除均属于二元运算。乘法下唯一两个幂等实数为0和1 [一元运算],例如 ++ ,正+,负-。比如[高斯符号],它是一个数学符号,形式为方括号[x],表示不大于x的最大整数,高斯符号是幂等的 [http... -
二元运算的错数
2019-12-25 20:37:21二元运算的错数,赵世忠,,误差的积累与传播机制是个挑战性难题. 针对加减乘除四则运算以及对数与幂指数函数, 本文定量讨论了它们的计算结果中错误有效数字� -
python的基本函数图像_python绘制基本初等函数图像
2020-12-22 17:08:22基本初等函数概念简单的说基本初等函数是不能再由其他更简单结构的函数通过加减乘除四则运算来结合而成的函数。在数学里,基本初等函数包括幂函数、指数函数、对数函数、三角函数、反三角函数、常数函数一共6类。... -
不用加减乘除做加法
2018-03-23 10:31:00分析:两个数相加不让用加减乘除,那肯定就是位运算了啊,用位运算模拟加法挺简单的,如果有快速幂的基础的话很容易能想到,按位异或然后按位与左移一位,直到按位与为0,在草稿纸上稍微画一下就能理解。不过我还是... -
Numpy入门之数学函数和逻辑函数
2020-10-27 16:14:19在数组运算中,常涉及到数组元素的相关计算,加减乘除等基础运算,Numpy都有函数与之对应 基础的算术运算 以上便是Numpy数组加减乘除的基础运算。 幂运算 在统计里面,常常要取平方运算,sqrt表示取平方根运算,... -
python【语法专栏】数值预算操作符、数值运算函数
2020-03-24 21:43:46数值运算操作符 操作符及使用 描述 x+y 加,x与y之和 x-y 减,x与y之差 ...y的复数 ...幂运算 示例: 加强操作符及使用 x op = y 即x = x op y,其中op为二元操作符 x+= y x =... -
初等函数
2019-03-28 09:13:00初等函数(基本函数)是由常函数、幂函数、指数函数、对数函数、三角函数和反三角函数经过有限次的有理运算(加、减、乘、除、有限次乘方、有限次开方)及有限次函数复合所产生、并且在定义域上能用一个方程式表示的... -
第二章 matlab的初等数学运算
2020-02-01 16:58:321.1主要数据类型 1.2初等数学运算(加减乘除幂指对三角函数多项式) 1.3运算符 -
numpy常用的的数学函数
2020-10-28 22:56:55numpy的数学函数数学函数一维数组的基本运算加 np.add减 np.subtract乘 np.multiply除 np.divide地板除法 np.floor_divide次幂运算 np.power二维数组的基本运算两个数组的基本运算三角函数np.sinnp.cosnp.tannp.... -
matlab多项式运算与代数方程求解器
2020-06-19 09:33:22Matlab 没有提供专门进行多项式加减运算的函数,事实上,多项式的加减就是其所对应的系数向量的加减运算 对于次数相同的多项式,可以直接对其系数向量进行加减运算; 如果两个多项式次数不同,则应该把低次多项式中... -
数组的ufunc()函数--通用函数
2019-06-14 20:20:44目录 1.四则运算 (1)加法 ---对应元素相加 (2)减法 ---对应元素相减 (3)乘法 ---对应元素相乘 ...加减乘除幂 创建数组 import numpy as np arr1=np.arange(4).reshape(2,2) print('arr1:',ar... -
内置PHP数学函数的三角函数,随机数等
2020-06-19 09:27:07编写代码时,我们需要经常比较,加,乘,减和除以不同的值。 有时,程序中所需的数学运算可能会涉及更多。 您可能需要使用对数,三角函数或指数函数。 在本教程中,我将通过示例讨论如何在PHP中使用这些功能。 ... -
基础数学:基本初等函数
2018-12-31 14:52:00基本初等函数 本文主要记载五种基本初等函数。...由这些基本初等函数经过有限次的四则运算(加减乘除)和函数的复合所得到的函数称为初等函数。 幂函数 power function 公式 $y=x^\alpha$ 其中,$x$是自变量,$... -
Tensorflow学习第五篇-张量的基本运算 2020-09-18
2020-09-18 12:20:331.加减乘除运算 2.幂指数运算 3.其他运算 4.三角函数和反三角函数 5.运算重载符 二、张量和NumPy的转换 三、向量运算 1.向量乘法 tf.matmul()或者@运算符 2.张量的统计函数 tf.reduce_sum()... -
PyTorch中的张量数学运算
2020-02-29 19:03:56加减乘除 torch.add() torch.addcdiv() torch.addcmul() torch.sub() torch.div() torch.mul() 对数,指数,幂函数 torch.log(input, out=None) ——以e为底 torch.log10(input, out=None) torch.log2(input, out=... -
NumPy数组&矩阵运算
2020-12-21 11:37:33目录NumPy数组&矩阵运算基本运算数组与数值的算术运算:加减乘除,幂余补等等数组与数组的算术运算向量点积三角函数运算四舍五入对矩阵不同维度上的元素进行求和计算数据的标准差和方差对矩阵不同维度上的元素求最大...