B 样条基函数

一、B 样条基函数的定义和性质

U = { u 0 , u 1 , ⋯ , u m } U=\{u_0,u_1,\cdots,u_m\} U={u0,u1,,um} 是一个单调不减的实数序列,即 u i ≤ u i + 1 , i = 0 , 1 , ⋯ , m − 1 u_i\leq u_{i+1},i=0,1,\cdots,m-1 uiui+1,i=0,1,,m1。其中, u i u_i ui 称为节点, U U U 称为节点矢量,用 N i , p ( u ) N_{i,p}(u) Ni,p(u) 表示第 i i i p p p 次( p + 1 p+1 p+1 阶)B 样条基函数,其定义为(也称为Cox-deBoor 公式
N i , 0 ( u ) = { 1 , u i ≤ u < u i + 1 , 0 , e l s e N i , p ( u ) = u − u i u i + p − u i N i , p − 1 ( u ) + u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) (1) \begin{aligned} N_{i,0}(u)&=\begin{cases}1,\quad &u_i\leq u< u_{i+1},\\ 0,&else \end{cases}\\[3ex] N_{i,p}(u)&=\frac{u-u_i}{u_{i+p}-u_i}N_{i,p-1}(u)+\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u)\tag{1} \end{aligned} Ni,0(u)Ni,p(u)={1,0,uiu<ui+1,else=ui+puiuuiNi,p1(u)+ui+p+1ui+1ui+p+1uNi+1,p1(u)(1)

由此可知:

  1. N i , 0 ( u ) N_{i,0}(u) Ni,0(u) 是一个阶梯函数,它在半开区间 u ∈ [ u i , u i + 1 ) u\in [u_i,u_{i+1}) u[ui,ui+1) 外都为零;
  2. p > 0 p>0 p>0 时, N i , p ( u ) N_{i,p}(u) Ni,p(u) 是两个 p − 1 p-1 p1 次基函数的线性组合;
  3. 计算一组基函数时需要事先指定节点矢量 U U U 和次数 p p p
  4. (1)式中可能出现 0 / 0 0/0 0/0,我们规定 0 / 0 = 0 0/0=0 0/0=0
  5. 半开区间 u ∈ [ u i , u i + 1 ) u\in [u_i,u_{i+1}) u[ui,ui+1) 称为第 i i i 个节点区间,它的长度可以为零,因为相邻节点可以是相同的。

例1. 令 U = { u 0 = 0 , u 1 = 0 , u 2 = 0 , u 3 = 1 , u 4 = 1 , u 5 = 1 } , p = 2 U=\{u_0=0,u_1=0,u_2=0,u_3=1,u_4=1,u_5=1\},p=2 U={u0=0,u1=0,u2=0,u3=1,u4=1,u5=1},p=2,我们分别计算 0 次、1 次和 2 次的 B 样条基函数。
N 0 , 0 = N 1 , 0 = 0 , − ∞ < u < ∞ N 2 , 0 = { 1 , 0 ≤ u < 1 0 , 其他 N 3 , 0 = N 4 , 0 = 0 , − ∞ < u < ∞ N 0 , 1 = u − 0 0 − 0 N 0 , 0 + 0 − u 0 − 0 N 1 , 0 = 0 , − ∞ < u < ∞ N 1 , 1 = u − 0 0 − 0 N 1 , 0 + 1 − u 1 − 0 N 2 , 0 = { 1 − u , 0 ≤ u < 1 0 , 其他 N 2 , 1 = u − 0 1 − 0 N 2 , 0 + 1 − u 1 − 1 N 3 , 0 = { u , 0 ≤ u < 1 0 , 其他 N 3 , 1 = u − 1 1 − 1 N 3 , 0 + 1 − u 1 − 1 N 4 , 0 = 0 , − ∞ < u < ∞ N 0 , 2 = u − 0 0 − 0 N 0 , 1 + 1 − u 1 − 0 N 1 , 1 = { ( 1 − u ) 2 , 0 ≤ u < 1 0 , 其他 N 1 , 2 = u − 0 1 − 0 N 1 , 1 + 1 − u 1 − 0 N 2 , 1 = { 2 u ( 1 − u ) , 0 ≤ u < 1 0 , 其他 N 2 , 2 = u − 0 1 − 0 N 2 , 1 + 1 − u 1 − 1 N 3 , 1 = { u 2 , 0 ≤ u < 1 0 , 其他 \begin{aligned} &N_{0,0}=N_{1,0}=0,\quad -\infty<u<\infty\\[2ex] &N_{2,0}=\begin{cases}1,\quad &0\leq u<1\\[2ex] 0,&其他 \end{cases}\\[2ex] &N_{3,0}=N_{4,0}=0,\quad -\infty<u<\infty\\[2ex] &N_{0,1}=\frac{u-0}{0-0}N_{0,0}+\frac{0-u}{0-0}N_{1,0}=0,\quad -\infty<u<\infty\\[2ex] &N_{1,1}=\frac{u-0}{0-0}N_{1,0}+\frac{1-u}{1-0}N_{2,0}=\begin{cases}1-u,\quad &0\leq u<1\\[2ex]0,&其他\end{cases}\\[2ex] &N_{2,1}=\frac{u-0}{1-0}N_{2,0}+\frac{1-u}{1-1}N_{3,0}=\begin{cases}u,\quad &0\leq u<1\\[2ex]0,&其他\end{cases}\\[2ex] &N_{3,1}=\frac{u-1}{1-1}N_{3,0}+\frac{1-u}{1-1}N_{4,0}=0,\quad -\infty<u<\infty\\[2ex] &N_{0,2}=\frac{u-0}{0-0}N_{0,1}+\frac{1-u}{1-0}N_{1,1}=\begin{cases}(1-u)^2,\quad &0\leq u<1\\[2ex]0,&其他\end{cases}\\[2ex] &N_{1,2}=\frac{u-0}{1-0}N_{1,1}+\frac{1-u}{1-0}N_{2,1}=\begin{cases}2u(1-u),\quad &0\leq u<1\\[2ex]0,&其他\end{cases}\\[2ex] &N_{2,2}=\frac{u-0}{1-0}N_{2,1}+\frac{1-u}{1-1}N_{3,1}=\begin{cases}u^2,\quad &0\leq u<1\\[2ex]0,&其他\end{cases}\\[2ex] \end{aligned} N0,0=N1,0=0,<u<N2,0= 1,0,0u<1其他N3,0=N4,0=0,<u<N0,1=00u0N0,0+000uN1,0=0,<u<N1,1=00u0N1,0+101uN2,0= 1u,0,0u<1其他N2,1=10u0N2,0+111uN3,0= u,0,0u<1其他N3,1=11u1N3,0+111uN4,0=0,<u<N0,2=00u0N0,1+101uN1,1= (1u)2,0,0u<1其他N1,2=10u0N1,1+101uN2,1= 2u(1u),0,0u<1其他N2,2=10u0N2,1+111uN3,1= u2,0,0u<1其他

二、B 样条基函数的导数

基函数的求导公式为
N i , p ′ = p u i + p − u i N i , p − 1 ( u ) + p u i + p + 1 − u i + 1 N i + 1 , p − 1 ( u ) (2) N^\prime_{i,p}=\frac{p}{u_{i+p}-u_i}N_{i,p-1}(u)+\frac{p}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}(u)\tag{2} Ni,p=ui+puipNi,p1(u)+ui+p+1ui+1pNi+1,p1(u)(2)

一般求导公式为
N i , p ( k ) = p ( N i , p − 1 ( k − 1 ) u i + p − u i − N i + 1 , p − 1 ( k − 1 ) u i + p + 1 − u i + 1 ) (3) N^{(k)}_{i,p}=p\Big(\frac{N_{i,p-1}^{(k-1)}}{u_{i+p}-u_i}-\frac{N_{i+1,p-1}^{(k-1)}}{u_{i+p+1}-u_{i+1}}\Big)\tag{3} Ni,p(k)=p(ui+puiNi,p1(k1)ui+p+1ui+1Ni+1,p1(k1))(3)

(4)式是(2)式的另一个推广,它根据基函数 N i , p − k , ⋯ , N i + k , p − k N_{i,p-k},\cdots,N_{i+k,p-k} Ni,pk,,Ni+k,pk 来计算 N i , p ( u ) N_{i,p}(u) Ni,p(u) k k k 阶导数:
N i , p ( k ) = p ! ( p − k ) ! ∑ j = 0 k a k , j N i + j , p − k (4) N^{(k)}_{i,p}=\frac{p!}{(p-k)!}\sum_{j=0}^ka_{k,j}N_{i+j,p-k}\tag{4} Ni,p(k)=(pk)!p!j=0kak,jNi+j,pk(4)

其中,
a 0 , 0 = 1 a k , 0 = a k − 1 , 0 u i + p − k + 1 − u i a k , j = a k − 1 , j − a k − 1 , j − 1 u i + p + j − k + 1 − u i + j , j = 1 , 2 , ⋯ , k − 1 a k , k = − a k − 1 , k − 1 u i + p + 1 − u i + k \begin{aligned} &a_{0,0}=1\\[2ex] &a_{k,0}=\frac{a_{k-1,0}}{u_{i+p-k+1}-u_i}\\[2ex] &a_{k,j}=\frac{a_{k-1,j}-a_{k-1,j-1}}{u_{i+p+j-k+1}-u_{i+j}},\quad j=1,2,\cdots,k-1\\[2ex] &a_{k,k}=\frac{-a_{k-1,k-1}}{u_{i+p+1}-u_{i+k}} \end{aligned} a0,0=1ak,0=ui+pk+1uiak1,0ak,j=ui+p+jk+1ui+jak1,jak1,j1,j=1,2,,k1ak,k=ui+p+1ui+kak1,k1

这里给出另一个计算 B 样条基函数各阶导数的公式
N i , p ( k ) = p p − k ( u − u i u i + p − u i N i , p − 1 ( k ) − u i + p + 1 − u u i + p + 1 − u i + 1 N i + 1 , p − 1 ( k ) ) , k = 0 , 1 , ⋯ , p − 1 (5) N_{i,p}^{(k)}=\frac{p}{p-k}\Big(\frac{u-u_i}{u_{i+p}-u_i}N_{i,p-1}^{(k)}-\frac{u_{i+p+1}-u}{u_{i+p+1}-u_{i+1}}N_{i+1,p-1}^{(k)}\Big),\quad k=0,1,\cdots,p-1\tag{5} Ni,p(k)=pkp(ui+puiuuiNi,p1(k)ui+p+1ui+1ui+p+1uNi+1,p1(k)),k=0,1,,p1(5)

一旦次数已给定,则节点矢量完全决定了基函数 N i , p ( u ) N_{i,p}(u) Ni,p(u)。节点矢量的类型有几种,本文中我们只考虑非周期节点矢量,它们具有以下形式:
U = { a , ⋯ , a ⏟ p + 1 , u p + 1 , ⋯ , u m − p − 1 , b , ⋯ , b ⏟ p + 1 } (6) U=\{\underbrace{a,\cdots,a}_{p+1},u_{p+1},\cdots,u_{m-p-1},\underbrace{b,\cdots,b}_{p+1}\}\tag{6} U={p+1 a,,a,up+1,,ump1,p+1 b,,b}(6)

即第一个和最后一个节点具有复杂度 p + 1 p+1 p+1

三、B 样条基函数的计算

U = { u 0 , u 1 , ⋯ , u m } U=\{u_0,u_1,\cdots,u_m\} U={u0,u1,,um} 为形如(6)式的节点矢量,假设我们感兴趣的是 p p p 次基函数,并假设 u u u 是固定的, u ∈ [ u i , u i + 1 ) u\in[u_i,u_{i+1}) u[ui,ui+1)。我们给出以下五个算法,分别用来计算:

  • 节点区间的下标 i i i
  • N i − p , p , ⋯ , N i , p N_{i-p,p},\cdots,N_{i,p} Nip,p,,Ni,p ( \big( ( 基于(1)式 ) \big) )
  • N i − p , p ( k ) ( u ) , ⋯ , N i , p ( k ) ( u ) , k = 0 , 1 , ⋯ , p N_{i-p,p}^{(k)}(u),\cdots,N_{i,p}^{(k)}(u),k=0,1,\cdots,p Nip,p(k)(u),,Ni,p(k)(u),k=0,1,,p;当 k > p k>p k>p 时导数为 0 ( \big( ( 这个算法基于(4)式 ) \big) )
  • 单个基函数 N j , p ( u ) , j = 0 , 1 , ⋯ , m − p − 1 N_{j,p}(u),j=0,1,\cdots,m-p-1 Nj,p(u),j=0,1,,mp1
  • 单个基函数的导数 N j , p ( k ) ( u ) , j = 0 , 1 , ⋯ , m − p − 1 , k = 0 , 1 , ⋯ , p N_{j,p}^{(k)}(u),j=0,1,\cdots,m-p-1,k=0,1,\cdots,p Nj,p(k)(u),j=0,1,,mp1,k=0,1,,p ( \big( ( 基于(3)式 ) \big) )

基函数和其导数计算的第一步就是确定 u u u 所属的节点区间,这可以通过对节点矢量使用线性搜索或二分法搜索得到。这里我们利用二分搜索法。由于我们使用的区间形式为 u ∈ [ u i , u i + 1 ) u\in[u_i,u_{i+1}) u[ui,ui+1),在计算基函数时需要考虑的一个情况是 u = u m u=u_m u=um 的情形,这时,我们直接将节点区间的下标设置为 m − p − 1 m-p-1 mp1,因此,在这种情况下 u ∈ ( u m − p − 1 , u m − p ] u\in(u_{m-p-1},u_{m-p}] u(ump1,ump]。下面的 FindSpan 算法返回 u u u 所在的节点区间的下标 i i i

def FindSpan(p, u, U):"""确定参数 u 所在的节点区间的下标:param p: 基函数次数:param u: 固定点:param U: 节点矢量:return: 节点区间的下标"""start, end = 0, len(U) - 1if u == U[-1]:return len(U) - p - 2if u == U[0]:return pwhile end != start + 1 and end != start:mid_index = (start + end) // 2if U[mid_index] == u:return mid_indexif u > U[mid_index]:start = mid_indexelse:end = mid_indexreturn start

现在我们考虑第二个算法,假设 u u u 在第 i i i 个节点区间内,计算所有非零 B 样条基函数。
例2. 设 p = 2 , U = { 0 , 0 , 0 , 1 , 2 , 3 , 4 , 4 , 5 , 5 , 5 } , u = 5 2 p=2,U=\{0,0,0,1,2,3,4,4,5,5,5\},u=\dfrac{5}{2} p=2,U={0,0,0,1,2,3,4,4,5,5,5},u=25。因为 u ∈ [ u 4 , u 5 ) u\in [u_4,u_5) u[u4,u5),因此 i = 4 i=4 i=4,所以我们需要计算
N 2 , 2 ( 5 2 ) N 3 , 1 ( 5 2 ) N 4 , 0 ( 5 2 ) N 3 , 2 ( 5 2 ) N 4 , 1 ( 5 2 ) N 4 , 2 ( 5 2 ) \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad N_{2,2}\Big(\dfrac{5}{2}\Big)\\[2ex] N_{3,1}\Big(\dfrac{5}{2}\Big)\\[2ex] N_{4,0}\Big(\dfrac{5}{2}\Big)\quad\quad\quad\quad\quad\quad\quad\quad\quad N_{3,2}\Big(\dfrac{5}{2}\Big)\\[2ex] N_{4,1}\Big(\dfrac{5}{2}\Big)\\[2ex] \quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad\quad N_{4,2}\Big(\dfrac{5}{2}\Big) N2,2(25)N3,1(25)N4,0(25)N3,2(25)N4,1(25)N4,2(25)

u = 5 2 u=\dfrac{5}{2} u=25 代入(1)式得到
N 4 , 0 ( 5 2 ) = 1 N 3 , 1 ( 5 2 ) = 1 2 N 4 , 1 ( 5 2 ) = 1 2 N 2 , 2 ( 5 2 ) = 1 8 N 3 , 2 ( 5 2 ) = 6 8 N 4 , 2 ( 5 2 ) = 1 8 \begin{aligned} &N_{4,0}\Big(\dfrac{5}{2}\Big)=1\\[3ex] &N_{3,1}\Big(\dfrac{5}{2}\Big)=\dfrac{1}{2}\quad N_{4,1}\Big(\dfrac{5}{2}\Big)=\dfrac{1}{2}\\[3ex] &N_{2,2}\Big(\dfrac{5}{2}\Big)=\dfrac{1}{8}\quad N_{3,2}\Big(\dfrac{5}{2}\Big)=\dfrac{6}{8}\quad N_{4,2}\Big(\dfrac{5}{2}\Big)=\dfrac{1}{8} \end{aligned} N4,0(25)=1N3,1(25)=21N4,1(25)=21N2,2(25)=81N3,2(25)=86N4,2(25)=81

在实际进行上述计算过程中,很容易发现计算时存在大量冗余的计算,从而设计 BasisFuns() 算法来计算所有非零 B 样条基函数并把它们存储在数组 N 中。

def BasisFuns(i, u, p, U):"""计算所有非零 B 样条基函数的值:param i: 所在的节点区间:param u: 固定值:param p: 基函数次数:param U: 节点矢量:return: 基函数值数组"""N = np.zeros(p+1)N[0] = 1.0left = np.zeros(p+1)right = np.zeros(p+1)for j in range(1, p+1):left[j] = u - U[i+1-j]right[j] = U[i+j] - usaved = 0.0for r in range(j):temp = N[r] / (right[r+1] + left[j-r])N[r] = saved + right[r+1] * tempsaved = left[j-r] * tempN[j] = savedreturn N

现在考虑第三个算法,用来计算所有的基函数及其导数 N r , p ( k ) ( u ) , r = i − p , ⋯ , i , k = 0 , 1 , ⋯ , n N_{r,p}^{(k)}(u),r=i-p,\cdots,i,k=0,1,\cdots,n Nr,p(k)(u),r=ip,,i,k=0,1,,n

def DersBasisFuns(i, u, p, n, U):"""计算非零 B 样条基函数及其导数:param i: 所在的节点区间:param u: 固定值:param p: 基函数次数:param n: n 阶导数:param U: 节点矢量:return: ders""""第一部分是对算法 BasisFuns() 进行修改,将函数值和节点差存到数组中"ndu = np.zeros((p+1, p+1))ders = np.zeros((n+1, p+1))a = np.zeros((2, p+1))ndu[0, 0] = 1.0left = np.zeros(p + 1)right = np.zeros(p + 1)for j in range(1, p+1):left[j] = u - U[i+1-j]right[j] = U[i+j] - usaved = 0.0for r in range(j):"下三角"ndu[j, r] = right[r+1] + left[j-r]temp = ndu[r, j-1] / ndu[j, r]"上三角"ndu[r, j] = saved + right[r+1] * tempsaved = left[j-r] * tempndu[j, j] = savedfor j in range(p+1):"载入基函数的值"ders[0, j] = ndu[j, p]"下面计算导数"for r in range(p+1):s1 = 0s2 = 1a[0, 0] = 1.0"循环计算 k 阶导数,k=1,2,…,n"for k in range(1, n+1):d = 0.0rk = r - kpk = p - kif r >= k:a[s2, 0] = a[s1, 0] / ndu[pk+1, rk]d = a[s2, 0] * ndu[rk, pk]if rk >= -1:j1 = 1else:j1 = -rkif r-1 <= pk:j2 = k - 1else:j2 = p - rfor j in range(j1, j2 + 1):a[s2, j] = (a[s1, j] - a[s1, j-1]) / ndu[pk+1, rk+j]d += a[s2, j] * ndu[rk+j, pk]if r <= pk:a[s2, k] = - a[s1, k-1] / ndu[pk+1, r]d += a[s2, k] * ndu[r, pk]ders[k, r] = dj = s1s1 = s2s2 = j"对结果乘以正确的因子"r = pfor k in range(1, n+1):for j in range(p+1):ders[k, j] *= rr *= (p - k)return ders

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAQUS应用04——集中质量的添加方法

文章目录 0. 背景1. 集中质量的编辑2. 约束的设置3. 总结 0. 背景 混塔ABAQUS模型中&#xff0c;机头、法兰等集中质量的设置是模型建立过程中的一部分&#xff0c;需要研究集中质量的添加。 1. 集中质量的编辑 集中质量本身的编辑没什么难度&#xff0c;我已经用Python代码…

Leetcode 第 124 场双周赛 Problem D 修改数组后最大化数组中的连续元素数目(Java + 模拟(分段/区间))

文章目录 题目思路Java 模拟&#xff08;分段/区间&#xff09;第 1 步&#xff1a;第 2 步&#xff1a;第 3 步&#xff1a; 复杂度Code 题目 Problem: 100205. 修改数组后最大化数组中的连续元素数目给你一个下标从 0 开始只包含 正 整数的数组 nums 。一开始&#xff0c;你…

Django后端开发——模型层及ORM介绍

文章目录 参考资料Django配置MySQL安装mysqlclient创建数据库进入数据库的操作可能遇到的问题及解决方案Pycharm配置settings.py 模型![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c83753397bf6481d8defde26537903bf.png)ORM介绍示例终端&#xff1a;settings.py…

Linux——开发工具的使用

目录 Linux软件包管理器 yum rzsz Linux编辑器——vim vim的使用 vim的基本操作 命令模式的常见命令 底行模式的常见命令 vim是需要配置的 Linux编译器——gcc/g 预处理 编译 汇编 链接 函数库 Linux项目自动化构建工具 make/makefile make原理 项目清理 Linux调试器g…

260.【华为OD机试真题】信道分配(贪心算法-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-信道分配二.解题思路三.题解代码Python题解代码…

踩坑实录(Fourth Day)

今天开工了&#xff0c;其实还沉浸在过年放假的喜悦中……今天在自己写 Vue3 的项目&#xff0c;虽说是跟着 B 站在敲&#xff0c;但是依旧是踩了一些个坑&#xff0c;就离谱……照着敲都能踩到坑&#xff0c;我也是醉了…… 此为第四篇&#xff08;2024 年 02 月 18 日&#x…

天锐绿盾|公司办公文件数据\资料自动智能透明加密——数据防泄漏系统

天锐绿盾是一款专注于企业电脑文件数据资料透明加密的防泄密系统。它采用了先进的文件过滤驱动透明加解密技术&#xff0c;可以对企业核心部门的文档进行强制加密处理&#xff0c;确保从文档创建开始就能自动加密保护。文件的保存加密、打开解密完全由后台加解密驱动内核自动完…

React中的函数组件

import React from ./react; import ReactDOM from ./react-dom;/*** 函数组件其实是一个函数&#xff0c;接收props,返回一个React元素*/ function FunctionComponent(props){let element <h1><span>hello</span>,{props.name}</h1>;console.log(el…

2024年热门项目持续分析,趣味测试小程序项目分析以及系统功能介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 趣味测试小程序是目前比较热门的娱乐测试&#xff0c;运行模式就是引导粉丝用户进去…

【《高性能 MySQL》摘录】第 3 章 服务器性能剖析

文章目录 3.1 性能优化简介3.1.1 通过性能剖析进行优化3.1.2 理解性能剖析 3.2 对应用程序进行性能剖析3.3 剖析 MySQL 查询3.3.1 剖析服务器负载捕获 MySQL 的查询到日志文件中分析查询日志 3.3.2 剖析单挑查询使用 SHOW PROFILE &#xff08;现已过时&#xff09;使用SHOW ST…

记录 | C++ cout.setf(ios::fixed)

cout.setf(ios::fixed); 是在 C 中使用的一个标准库函数&#xff0c;用于将流的输出格式设置为"fixed" "fixed"格式指定输出浮点数时&#xff0c;小数点后的位数是固定的。这意味着&#xff0c;无论输出的数字有多少位小数&#xff0c;小数点后都会保留相…

Win32 获取EXE/DLL文件版本信息

CFileVersion.h #pragma once#include <windows.h> #include <string> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 版本号辅助类 class CVersionNumber { public:CVersionNumber() :m_…

Qt程序设计-无边框可移动可拖拽调整大小窗体

本文讲解Qt-无边框可移动可拖拽调整大小窗体。 通过鼠标的按下移动进行窗体的移动,拖拽调整窗体大小。 实现过程如下: 创建QWidget窗体,添加一个按钮控制窗体的关闭。 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget>#include <QMouseEvent> //定…

【天衍系列 05】Flink集成KafkaSink组件:实现流式数据的可靠传输 高效协同

文章目录 01 KafkaSink 版本&导言02 KafkaSink 基本概念03 KafkaSink 工作原理1.初始化连接2.定义序列化模式3.创建KafkaSink算子4.创建数据源5.将数据流添加到KafkaSink6.内部工作机制 04 KafkaSink参数配置05 KafkaSink 应用依赖06 KafkaSink 快速入门6.1 包结构6.2 项目…

【深度学习:数据注释工具】构建与购买:从业者的经验教训

【深度学习&#xff1a;数据注释工具】构建与购买&#xff1a;从业者的经验教训 为什么数据注释团队需要标记工具&#xff1f;您的软件工程团队是否有时间/资源来构建数据注释解决方案&#xff1f;为您的项目构建数据注释工具需要多长时间&#xff1f;将开发外包给第三方会更有…

异地组网延迟怎么解决问题?

异地组网中的延迟问题可以通过SD-WAN&#xff08;Software-Defined Wide Area Network&#xff09;技术进行解决。SD-WAN可以通过优化网络流量和智能路由选择来降低延迟&#xff0c;提高应用程序的性能和用户体验。接下来将介绍使用SD-WAN解决异地组网延迟问题的常用方法。 1.…

SSH密钥认证登陆流程(Vscode连接到远程)

目录 前言连接远程步骤1. 下载工具包wsCli到本地机器2. 本地机器上生成ssh密钥3. 在服务器上安装公钥4. vscode连接到远程 参考资料 前言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和安全传输数据的网络协议。它提供了两种主要的远程连接方式&#xff1a; 密…

学习总结18

# 营救 ## 题目背景 “咚咚咚……”“查水表&#xff01;”原来是查水表来了&#xff0c;现在哪里找这么热心上门的查表员啊&#xff01;小明感动得热泪盈眶&#xff0c;开起了门…… ## 题目描述 妈妈下班回家&#xff0c;街坊邻居说小明被一群陌生人强行押上了警车&#…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

C/C++输出输出相关问题

C/C输出输出相关问题 scanf(“%d”),如果缓存区的开始是数字&#xff0c;scanf会读入&#xff0c;直到遇见非数字字符&#xff0c;否则远不会读入 #include<iostream> using namespace std; int main() {int a[100];char c[100];// scanf的返回值为“所输入的数据与格式字…