数值计算+数学软件
文章平均质量分 80
介绍各种数值计算算法,还有数学软件是使用方法,原理等。
liyuanbhu
这个作者很懒,什么都没留下…
展开
-
仿射变换 (Affine transform) 参数估计方法
仿射变换 (Affine transform) 参数估计方法最近一个机器视觉课题中的一个小问题。两幅图像中各有一些特征点,我们分别称为 (xi,yi)(x_i, y_i)(xi,yi) 和 (ui,vi)(u_i, v_i)(ui,vi)。这两组特征点可以由坐标的旋转和平移变换相联系。也就是说:(xiyi)=(cosθ−sinθsinθcosθ)(uivi)+(t1t2)\begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix}原创 2021-04-29 08:55:08 · 2102 阅读 · 1 评论 -
直线拟合算法(续:加权最小二乘)
直线拟合算法(续:加权最小二乘)在此之前,我写过两篇文章介绍直线拟合算法:https://blog.csdn.net/liyuanbhu/article/details/50866802https://blog.csdn.net/liyuanbhu/article/details/51137038这两篇文章中的算法都有一个不足,就是离群点对计算结果干扰较大。因为考察的是各个点到直线的距离的...原创 2019-07-29 00:15:03 · 8315 阅读 · 13 评论 -
平行线拟合问题(附带 C++ 源代码)
#平行线拟合问题这个问题来源于最近项目中的实际需求,在图像中有一些平行线,要测量两个平行线的间距。这个问题应该算是机器视觉测量类问题中一个比较典型的问题。影像测量仪测量的长度基本都是这种平行线间距离。这里假设我们已经获得了足够的数据点,第一条直线上的数据点形成集合{(x1,i,y1,i)}\{(x_{1,i}, y_{1,i})\}{(x1,i,y1,i)},第二条直线上的数据点形成集合 ...原创 2019-07-28 11:52:05 · 2238 阅读 · 4 评论 -
多项式的余数定理及其应用
多项式的余数定理及其应用(C++)f(x)f(x)f(x) 是一个 $N $ 次多项式: f(x)=a0+a1x+⋯+aNxNf(x) = a_0 + a_1 x + \cdots + a_N x^Nf(x)=a0+a1x+⋯+aNxN那么 f(x)f(x)f(x) 被 (x−c)(x - c)(x−c) 除得到的商等于 f(c)f(c)f(c)。 也就是如果f(x)=Q(x)(x−c...原创 2018-10-01 11:27:17 · 7172 阅读 · 0 评论 -
全选主元高斯消去法 C++ 代码
上一篇博客的代码中用到了线性代数方程组的求解功能,当时用的是徐士良《C常用算法程序集》里面的全选主元高斯消去法的函数 cagaus 。徐士良这本书写的还是很实用的,里面的代码都属于拿来就可以用的。但是有一个缺点就是代码没有注释,里面的变量名取的也很随意,经常是 i、j、k、a、b、c 一类的。所以里面的代码读起来挺费劲。趁着周末有点时间,我把徐士良书里的 cagaus 做了个整理,加上了必要的...原创 2018-05-06 18:47:36 · 2927 阅读 · 1 评论 -
球面拟合算法
球面拟合算法我在以前的博客中写过一篇介绍过最小二乘法圆拟合算法。前段时间有人给我留言,问我他的数据点是分布在一个球的球面上的,该如何拟合这个球的参数。球面拟合与圆的拟合其实是很类似的。只要按照我上篇文章的方法重新推导一下就能出来。正好这两天不太忙,在出差的路上推导了一下,把结果放到这里供大家参考。顺便多说一句,在高铁上用降噪耳机效果真的很好,很安静,值得拥有。简单描述一下问题:我们有一组数...原创 2018-05-04 22:58:27 · 12973 阅读 · 6 评论 -
C++ 中使用伪随机数
使用过 C语言标准库中随机数相关功能的同学肯定还记得 C 库中提供的两个函数,这么多年来C语言标准库中随机数生成的相关的函数就只有这两个。并且 rand() 函数只能生成 [0, RAND_MAX] 之间的均匀分布的随机整数,用起来非常不方便。许多 C\++ 的程序员在使用到随机数功能时,也只会用 C 标准库中这两个函数原创 2017-04-22 21:33:48 · 6097 阅读 · 0 评论 -
循环冗余校验 (CRC) 计算的C++ 代码
最近经常有人发私信给我找我帮忙计算 CRC 校验。其实我有一篇博客 http://blog.csdn.net/liyuanbhu/article/details/7882789 里面介绍了CRC 计算的原理,也给出了些代码,里面的代码稍微改改就能计算常见的各种 CRC。 但是可能 CRC 计算确实有点难度,改写我的代码也不那么容易。趁着周末空闲,把原来的代码重新整理了一下,用 C++ 重新实现了原创 2017-04-16 15:19:14 · 13442 阅读 · 2 评论 -
埃尔米特函数的计算(C++)
前两篇博客介绍了埃尔米特多项式和埃尔米特函数的基本性质。我研究这些的目的其实是为了解决一个函数逼近问题。也就是我要用埃尔米特函数去逼近另外一个函数。有了前两篇的铺垫,这个工作似乎挺简单。上一篇讲到了: f(x)=∑n=0∞fnψn(x)f(x) = \sum_{n=0}^{\infty} f_n \psi_n(x) 其中: fn=∫∞−∞f(x)ψn(x)dxf_n = \int_{-\原创 2017-03-18 22:57:59 · 5172 阅读 · 0 评论 -
多项式求值的几个简单算法(C语言)
最近在读 Numerical Recipes in C++ ,上面给了些多项式求值的算法,很实用。放在这里备用。三个函数,分别是多项式求值,多项式求导数值,多项式求各阶导数值。下面的代码全都简单验算过,应该没什么问题,可以大胆的使用。/** * @brief dpoly 计算多项式的值和一阶导数值 * @param coff 多项式的系数,c0, c1, ... cN * @param N原创 2017-03-12 22:10:50 · 20835 阅读 · 0 评论 -
Qt 中 qRound() 函数的使用时的一个小问题
Qt 中的 qRound() 函数是用来对浮点数四舍五入的。我最近在写的一个算法中用到了这个函数,发现了一个小问题。我的那个代码类似这样:double f; int i, j, k;j = i + qRound(f); k = j - qRound(-f);按照我最开始的想法,这里的 j 和k 应该是相同的。结果测试时发现对某些 f ,这两个值是不同的。仔细研究了一下,发现是这样的,四舍五入时原创 2017-03-11 12:40:42 · 8636 阅读 · 1 评论 -
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 2
接上一篇。。。下面我们将 SVD 相关的功能封装成一个类,以方便我们提取 SS 和 VV 的值。 另外,当我们一个 AA 有多组 xx 需要求解时,也只需要计算一次 SVD 分解,用下面的类能减少很多计算量。头文件如下: #ifndef GSLSINGULARVALUEDECOMPOSITION_H #define GSLSINGULARVALUEDECOMPOSITION_H原创 2016-12-10 19:34:46 · 1614 阅读 · 0 评论 -
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)最近在学习高动态图像(HDR)合成的算法,其中需要求解一个超定方程组,因此花了点时间研究了一下如何用 GSL 来解决这个问题。GSL 里是有个最小二乘法拟合(Least-Squares Fitting)的相关算法的,这些算法的声明在 gsl_fit.h 中,所以直接用 GSL 提供的 gsl_fit_linear 函数就能解决这个问题。不过我想顺原创 2016-11-20 12:58:28 · 5715 阅读 · 4 评论 -
三点确定一个圆的计算方法
三点确定一个圆的计算方法最近在写的一个软件需要根据三个坐标点来计算一个圆。因此花了点时间推导了相关的公式。这个推导不算太难,放在这里主要是做个备忘。我们设一个圆的圆心坐标为 (x0,y)(x_0, y),半径为 rr。那么这个圆的方程可以写为: (x−x0)2+(y−y0)2=r2(x - x_0)^2 + (y - y_0)^2 = r^2在这个圆上随便取三个点,设这三个点的坐标分别是 (x原创 2016-10-22 13:40:51 · 67967 阅读 · 23 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(8)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(8)gsl_ieee 模块这个模块缺少对 MSVC 平台的支持。我们需要自己写一个 fp_msvc.c 文件:/* ieee-utils/fp-msvc.c * * Copyright (C) 2015 LiYuan * * This program is free so原创 2016-08-29 21:31:26 · 3337 阅读 · 1 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(7)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(7)gsl_dht 模块项目文件:#-------------------------------------------------## Project created by QtCreator 2016-08-26T20:38:46##------------------原创 2016-08-29 20:09:04 · 1333 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(6)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(6)gsl_randist 模块多个文件中的 inline 需改为 __inline。项目文件如下:#-------------------------------------------------## Project created by QtCreator 2016-08-原创 2016-08-28 14:15:08 · 1593 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(5)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(5)gsl_blas 模块项目文件:#-------------------------------------------------## Project created by QtCreator 2016-08-26T20:38:46##-----------------原创 2016-08-27 20:46:32 · 1740 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(4)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(4)gsl_permutation 模块#-------------------------------------------------## Project created by QtCreator 2016-08-26T20:38:46##---------------原创 2016-08-27 18:21:01 · 1359 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(3)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(3)上一篇博客中介绍了如何生成 gsl_sys gsl_err gsl_complex 和 gsl_poly 模块。今天继续介绍如何生成 gsl 的其他部分。gsl_specfunc 模块这个模块内提供的是多种特殊函数。首先将所有 gsl_ 开头的头文件都拷贝到 include/gs原创 2016-08-27 13:34:44 · 1324 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(2)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(2)上一篇博客中介绍了如何生成 gslcblas.lib 和 gslcblas.dll。今天继续介绍如何生成 gsl 的其他部分。gsl 是一个比较大的库,直接将 gsl 的全部内容打包成一个库文件虽然是可行的,但是会很麻烦。因为,gsl 不同模块有许多相同名字的源文件。比如 vec原创 2016-08-27 10:06:17 · 1715 阅读 · 0 评论 -
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(1)
Visual Stdio C++ 编译器 编译 (GSL) GNU Scientific Library 的方法介绍(1)以前一直都是用 MINGW 来编译 GSL 的,这样编译出来的 GSL 可以在 VS2013 及以下版本的 Visual Stdio 中使用。但是最近升级 Visual Stdio 到 Visual Stdio 2015 就发现问题了。编译应用程序时会报错误,提示有几个 exte原创 2016-08-26 21:54:20 · 4643 阅读 · 6 评论 -
直线拟合算法(续)
直线拟合算法(续)以前写过一篇博客,介绍直线拟合算法。http://blog.csdn.net/liyuanbhu/article/details/50866802给出的代码其实有一点小问题,就是 den = 0 时会出现除以 0 的错误。今天正好也有网友问起这个问题。我就再写一篇短文来说说如何解决这个问题。首先我们知道:den=D2xy+(λ−Dxx)2−−−−−−−−−−−−−−√den =原创 2016-04-12 20:52:38 · 8343 阅读 · 8 评论 -
圆拟合算法(距离之和最小)
上一篇博客介绍了最小二乘法拟合圆的方法。这种方法对误差符合正态分布的数据点很有效。但是在机器视觉应用中经常会碰到一些干扰点。这些干扰点多数时候是偏向某一个方向的。这时要是用最小二乘法拟合,拟合出的圆会偏很多。因此,有必要研究更有效的拟合算法。这里介绍一个我常用的拟合算法,根据数据点到圆的距离绝对值的和来确定圆的参数,也就是下面这个式子:f=∑∣∣(xi−xc)2+(yi−yc)2−−−−−−−−−−原创 2016-03-14 22:35:46 · 46321 阅读 · 18 评论 -
最小二乘法拟合圆
有一系列的数据点 {xi,yi}\{x_i, y_i\},我们知道这些数据点近似的落在一个圆上,根据这些数据估计这个圆的参数就是一个很有意义的问题。今天就来讲讲如何来做圆的拟合。圆拟合的方法有很多种,最小二乘法属于比较简单的一种。今天就先将这种。我们知道圆方程可以写为: (x−xc)2+(y−yc)2=R2(x - x_c)^2 + (y - y_c)^2 = R^2通常的最小二乘拟合要求距离的原创 2016-03-14 22:05:04 · 90413 阅读 · 39 评论 -
直线拟合算法
在计算机视觉的应用中,经常会用到提取一条直线的精确位置这样的工作。这时就要用到直线的拟合算法了。这里,我也贴一个利用最小二乘法计算最佳拟合直线的代码。这个代码是我以前学习《机器视觉算法与应用(双语版)》[德] 斯蒂格(Steger C) 著;杨少荣 等 译 的书时写的。所有的公式推导都在书中 3.8.1 ,还算比较有用。 与一元线性回归算法的区别:一元线性回归算法假定 X 是无误差的,只有 Y原创 2016-03-12 18:27:48 · 34279 阅读 · 8 评论 -
水木社区上看到的一道概率题
水木社区上看到的一道概率题原帖是这样的: 发信人: runformore (奎罗伊), 信区: Mathematics 标 题: 问个谷歌面试的问题 发信站: 水木社区 (Mon Feb 1 03:51:24 2016), 站内 1维,1米长的路面,每次下一滴雨,每滴雨落到地面上长度是0.01米,落点假设均匀分布,求问下了多少滴雨之后路面会全部湿透,求期望?这原创 2016-02-08 20:38:29 · 4168 阅读 · 0 评论 -
Visual Stdio 环境下使用 GSL (GNU Scientific Library)
Visual Stdio 环境下使用 GSL (GNU Scientific Library)GNU Scientific Library (GSL)是一个开源的科学计算的函数库,功能非常强大。网上介绍它的文章很多,而且 GSL 的文档也写的非常的好,属于那种特别容易上手的函数库。这里就不多对 GSL 进行介绍了。今天要讲的是如何在 Visual stdio 环境下使用这个库。其实这方面的内容网上也原创 2015-08-15 20:31:11 · 8648 阅读 · 26 评论 -
我写的一个 C++ 复数类
我的C++ 的基础一直都不太扎实,最近有点空闲时间,找了本 C++ Primer 仔细的读了读。看完运算符重载那一章时,就想到写个复数类来练一练手。实际上 C++ 中是有复数类的,而且还是个模版类,比我这个类用起来更灵活。不过我的类也有自己的特点,就是支持相当多的数学函数,那些函数相应的代码是从 GSL 中借来的,所以计算结果还算是可靠的,大多数的函数的计算结果 都用 Mathematica原创 2015-02-28 10:15:54 · 8967 阅读 · 3 评论 -
GSL 学习笔记(快速傅立叶变换)
GSL 学习笔记(快速傅立叶变换)GNU Scientific Library (GSL)是一个开源的科学计算的函数库,里面实现了大量的数学函数,还提供了方程求解、傅立叶变换等多种功能。GSL 中FFT 的定义如下,正变换(forward):逆变换(inverse):还有一个叫做反向变换:反变换(backward):复数FFT,长度为2^N这是最简单的一种。C89标原创 2014-11-08 21:14:58 · 8959 阅读 · 3 评论 -
直接数字频率合成技术及其C++的实现
DDFS-Direct Digital Frequency Synthesizer 直接数字频率合成技术可以用来产生任意波形的周期信号。所谓的DDFS简单的说是查表法,内部维护一个Lookup Table储存一个周期的波形。那么这个查找表其实就是给出了相位到函数值的一个映射关系:这里相位ω又是时间t的线性函数。而调整输出频率实际上就是调整相位函数的系数kΔ。举个原创 2014-09-15 13:23:10 · 4820 阅读 · 2 评论 -
多项式计算的Horner 方法
Horner 算法是以英国数学家 William George Horner 命名的一种多项式求值的快速算法,实际上,这种快速算法在他之前就已经被Paolo Ruffini使用过了。而中国数学家秦九韶提出这种算法要比William George Horner 早600多年。P(x) 是一个多项式:我们希望计算x取某个特殊值x0时多项式的值p(x0).构造一个序列:原创 2014-08-19 10:54:08 · 19620 阅读 · 0 评论 -
Numpy 入门教程(2)
翻译自官方文档Tentative NumPy Tutorial,有删节。基本操作基本的算术运算符都可以应用于数组类型,结果为对应元素之间的运,返回值为一个新的数组。>>> a = array( [20,30,40,50] )>>> b = arange( 4 )>>> barray([0, 1, 2, 3])>>> c = a-b>>> carray([20,原创 2014-06-06 12:12:36 · 5867 阅读 · 1 评论 -
Numpy 入门教程(1)
翻译自官方文档Tentative NumPy Tutorial,有删节。Numpy 入门教程NumPy 提供了对多维数组的支持,与Python原生支持的List类型不同,数组的所有元素必须同样的类型。数组的维度被称为axes,维数称为 rank。 Numpy的数组类型为 ndarray, ndarray 的重要属性包括: ndarray.ndim:数组的维数,也称为rank原创 2014-06-05 13:25:05 · 27384 阅读 · 2 评论 -
将分数表示为任意进制的小数
最近在翻看一本数学分析教材中关于实数的基本理论的章节,其中对有理数的小数表示方法给出了严密的定义和详细的讨论。看后很有收获,然后突然就想到了这么个问题,如何编个程序将有理数的分数表示转换为小数表示,并且对于无限循环小数还要给出循环节来。 花了半天时间将程序写好调通。把程序放在这里做个记录。原创 2013-11-19 13:14:56 · 2450 阅读 · 0 评论 -
Savitzky-Golay滤波器(2)
前几天写过一篇介绍 Savitzky-Golay滤波器的文章, 没想到最近做项目还真的用上了。因此就顺便写了个 C 语言的自动计算生成 SG 滤波器系数的程序。利用这里的代码可以生成任意阶数的 SG 滤波器。对于一些需要动态调整 SG 滤波器系数的场合,这里的代码还是很实用的。 上次的文章中给出了计算 SG 滤波器系数的 matlab 代码。 x=[zeros(1,M),1,ze原创 2013-09-13 13:23:52 · 17136 阅读 · 5 评论 -
几个简单的数据点平滑处理算法
最近在写一些数据处理的程序。经常需要对数据进行平滑处理。直接用FIR滤波器或IIR滤波器都有一个启动问题,滤波完成后总要对数据掐头去尾。因此去找了些简单的数据平滑处理的方法。在一本老版本的《数学手册》中找到了几个基于最小二乘法的数据平滑算法。将其写成了C 代码,测试了一下,效果还可以。这里简单的记录一下,算是给自己做个笔记。原创 2013-09-05 13:29:54 · 161346 阅读 · 70 评论 -
利用FFT 计算生成离散解析信号
通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只包含正频率部分,而且这个复信号的实部正好就是我们原来的实值信号。简单的推导可知,复信号的虚部是原信号的希尔伯特变换。这样构造出来的信号就叫做解析信号。因此,如何生成解析信号与如何对一个信号进行希尔伯特变换其实是等价的问题。获得解析信号后可以计算波形的包络、瞬时频率、相位等,是非常有用的。所以如何生成解析信号原创 2013-09-03 15:12:20 · 5202 阅读 · 0 评论 -
log1p(x) 函数的实现 (续)
几个月前写过一篇文章《log1p(x) 和 expm1(x) 函数的实现》http://blog.csdn.net/liyuanbhu/article/details/8544644当时给出了个 GSL 的 log1p(x) 的代码实现。不过当时没想明白为什么要那样算,最近在水木上看一个帖子时突然就领悟了。GSL 上的代码如下:double gsl_log1p (con原创 2013-05-31 09:40:57 · 3969 阅读 · 2 评论 -
如何生成均匀分布随机整数
前几天在水木上看到一个帖子,问如何用硬件实现一个0-56的随机数。这个问题初看起来不是很难,但是仔细想想还是蛮难实现的,尤其是希望能够尽量少的占用芯片面积时。由这个问题,我想到另外一个稍微简单一些的问题,就是如何在程序中生成一个[0, N-1] 的随机整数。我们知道,C语言的标准库中有个 rand() 函数,这个函数可以生成[0, RAND_MAX] 之间的随机整数,并且理论上来说生成的随机整原创 2013-03-03 14:24:37 · 21845 阅读 · 2 评论