7.1 线性代数进行图像处理

一、图像的奇异值分解介绍

A A A 的奇异值定理就是 A T A A^TA ATA A A T AA^T AAT 的特征值定理。 这是本章的内容的预览。 A A A 有两个奇异向量的集合( A T A A^TA ATA A A T AA^T AAT 的特征向量),有一个是正奇异值的集合(因为 A T A A^TA ATA A A T AA^T AAT 有相同的正特征值)。通常 A A A 是长方形的矩阵,但是 A T A A^TA ATA A A T AA^T AAT 是方阵,对称的且至少是半正定的。
奇异值分解(The Singular Value Decomposition:SVD)可以将任意的矩阵分解成简单的片(pieces)。 每个片都是一个列向量乘一个行向量,一个 m × n m\times n m×n 的矩阵有 m × n m\times n m×n 个元素(如果表示的是一个图像则会是很大的数字),但是列和行仅有 m + n m+n m+n 个分量,远少于 m × n m\times n m×n。这些列乘行 (colum)(row) 的小片是可以非常快速处理的全尺寸大小矩阵(full size matrices)—— 它们仅需要 m + n m+n m+n 个数。
不寻常的是,SVD 的图像处理应用是在它所依赖的代数矩阵之前出现的,下面会从只包含一个或两个片的简单图像开始。现在我们将图像想象成一个大的长方形矩阵,元素 a i j a_{ij} aij 表示的是图像所有像素的灰度值,可以将像素想象成一个小的正方形,从左下角开始向右 i i i 步和向上 j j j 步,它的灰度值是一个数字(通常的范围是 0 ≤ a i j ≤ 256 = 2 8 0\le a_{ij}\le256=2^8 0aij256=28),一个纯白的像素是 a i j = 255 = 11111111 a_{ij}=255=11111111 aij=255=11111111,计算机将 255 255 255 用二进制表示时,这个数字就是 8 8 8 1 1 1
目前我们已经知道一个图像有 m × n m\times n m×n 个像素,每个像素使用 8 8 8 位( 0 0 0 1 1 1)表示它的灰度,变成了一个 m × n m\times n m×n 的矩阵,其中的每个元素都有 256 256 256 种的可能值。
简单的说,一个图像就是一个大的矩阵,为了完美复制它,我们需要 8 ( m ) ( n ) 8(m)(n) 8(m)(n) 比特的信息。高分辨率的电视通常是 m = 1080 m=1080 m=1080 n = 1920 n=1920 n=1920,每秒有 24 24 24 帧,如果是彩色的,会有 3 3 3 个颜色度,那么需要每秒传输 ( 3 ) ( 8 ) ( 24 ) ( 1920 ) ( 1080 ) (3)(8)(24)(1920)(1080) (3)(8)(24)(1920)(1080) 位,这个成本太高了所以也不太会这么做,发射器跟不上要显示的速度。
如果压缩做的很好的话,那么我们是无法看出和原始图像的区别的。图像的边缘(灰度的突然变化)是很难压缩的部分。
如果每个 a i j a_{ij} aij 都是独立的随机数字,那么就不可能在压缩方面取得大的成果。我们完全依赖这样的一个事实:相邻的像素通常由相似的灰度,当跨越边缘时就会出现突然的跳变。卡通图片要比现实图片更容易压缩,这是因为它到处都是边缘。
对于视频来说,数字 a i j a_{ij} aij 不会在帧与帧之间变化太大,我们只传输小的变化。这就是 H.264 视频压缩标准的差分编码。我们使用线性代数(和非线性的 “量化quantization”,这是计算机中高效的转换成正数的一步)压缩每个变化矩阵。
我们每天看到的自然图像完全适合且可以进行压缩处理。

二、低秩图像(例子)

最容易压缩的图像是全黑或全白或全是一个常数灰度 g g g,矩阵 A A A 的每个元素的数都是同样的 g g g a i j = g a_{ij}=g aij=g,当 g = 1 g=1 g=1 m = n = 6 m=n=6 m=n=6 时,下面是图像处理中关于 SVD 核心理论的一个极端的例子:

例1 不是发送 A = [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] 而是发送 A = [ 1 1 1 1 1 1 ] [ 1 1 1 1 1 1 ] \pmb{不是发送}\,A=\begin{bmatrix}1&1&1&1&1&1\\1&1&1&1&1&1\\1&1&1&1&1&1\\1&1&1&1&1&1\\1&1&1&1&1&1\\1&1&1&1&1&1\end{bmatrix}\kern 5pt\pmb{而是发送}\,A=\begin{bmatrix}1\\1\\1\\1\\1\\1\end{bmatrix}\begin{bmatrix}1&1&1&1&1&1\end{bmatrix} 不是发送A= 111111111111111111111111111111111111 而是发送A= 111111 [111111] 36 36 36 个数字变成了 12 12 12 个数字,如果是 300 × 300 300\times300 300×300 个像素,那么就是 90000 90000 90000 个数变成 600 600 600 个数。如果我们提前定义好全一向量 x \boldsymbol x x,我们只需要发送一个数字,这个数字就是常数灰度 g g g,它乘上 x x T \boldsymbol x\boldsymbol x^T xxT 得到这个矩阵。
当然第一个例子很极端,但它阐明了一个重要观点,如果能够预先定义一些特殊的向量如全一向量 x = ones \boldsymbol x=\textrm{\pmb{ones}} x=ones,那么图像处理将会变得非常高效,本质上是预选基(preselected bases)(如傅里叶基通过 FFT 进行加速)和自适应基(adaptive bases) 之间的较量。SVD 通过图像本身生成基 —— 这个是自适应的,它的计算成本可能比较高。
并不是说 SVD 总是或者通常在实际上是最有效的算法,下面这些例子的目的只是为了介绍而不是实际生产使用。

例2 “ ace 三色旗 ” 法国国旗 A 意大利国旗 A 德国国旗 A T 不要发送 A = [ a a c c e e a a c c e e a a c c e e a a c c e e a a c c e e a a c c e e ] 发送 A = [ 1 1 1 1 1 1 ] [ a a c c e e ] \begin{array}{l}“\pmb{\textrm{ace}\,\,三色旗}”\\法国国旗\,\,A\\意大利国旗\,A\\德国国旗\,\,A^T\end{array}\kern 5pt\pmb{不要发送}\,A=\begin{bmatrix}a&a&c&c&e&e\\a&a&c&c&e&e\\a&a&c&c&e&e\\a&a&c&c&e&e\\a&a&c&c&e&e\\a&a&c&c&e&e\end{bmatrix}\kern 5pt\pmb{发送}\,A=\begin{bmatrix}1\\1\\1\\1\\1\\1\end{bmatrix}\begin{bmatrix}a&a&c&c&e&e\end{bmatrix} ace三色旗法国国旗A意大利国旗A德国国旗AT不要发送A= aaaaaaaaaaaacccccccccccceeeeeeeeeeee 发送A= 111111 [aaccee]这个虽说有 3 3 3 种颜色,但是它的秩仍然是 1 1 1,我们仍然可以用一列乘上一行。这 36 36 36 个元素甚至可能都不相同,但是只要是秩一的模式 A = u 1 v 1 T A=\boldsymbol u_1\boldsymbol v_1^T A=u1v1T 都可以压缩。但是如果秩提升至 r = 2 r=2 r=2,就需要 u 1 v 1 T + u 2 v 2 T \boldsymbol u_1\boldsymbol v_1^T+\boldsymbol u_2\boldsymbol v_2^T u1v1T+u2v2T,例如:

例3内嵌的方块矩阵 A = [ 1 0 1 1 ] \boxed{A=\begin{bmatrix}1&0\\1&1\end{bmatrix}} A=[1101] 等于 A = [ 1 1 ] [ 1 1 ] − [ 1 0 ] [ 0 1 ] \boxed{A=\begin{bmatrix}1\\1\end{bmatrix}\begin{bmatrix}1&1\end{bmatrix}-\begin{bmatrix}1\\0\end{bmatrix}\begin{bmatrix}0&1\end{bmatrix}} A=[11][11][10][01]

这里矩阵 A A A 中的 1 1 1 0 0 0 可以为块状的 1 ′ s 1's 1s 0 ′ s 0's 0s,它的秩仍为 2 2 2,我们同样只需要两项 u 1 v 1 T + u 2 v 2 T \boldsymbol u_1\boldsymbol v_1^T+\boldsymbol u_2\boldsymbol v_2^T u1v1T+u2v2T。一个 6 × 6 6\times6 6×6 的图像可以被压缩成 24 24 24 个数字,一个 N × N N\times N N×N 的图像( N 2 N^2 N2 个数字)能够压缩成来自向量 u 1 , v 1 , u 2 , v 2 \boldsymbol u_1,\boldsymbol v_1,\boldsymbol u_2,\boldsymbol v_2 u1,v1,u2,v2 这四个向量的 4 N 4N 4N 个数字。
这里 u ′ s \boldsymbol u's us v ′ s \boldsymbol v's vs 是最佳的选择吗?这个并不是 SVD 的选择!注意到 u 1 = ( 1 , 1 ) \boldsymbol u_1=(1,1) u1=(1,1) u 2 = ( 1 , 0 ) \boldsymbol u_2=(1,0) u2=(1,0) 并不是正交的, v 1 = ( 1 , 1 ) \boldsymbol v_1=(1,1) v1=(1,1) v 2 = ( 0 , 1 ) \boldsymbol v_2=(0,1) v2=(0,1) 也不正交。理论表明:正交性能够使得第二项 c 2 u 2 v 2 T c_2\boldsymbol u_2\boldsymbol v_2^T c2u2v2T 更小。(SVD 按照重要性的顺序选择秩一项。)
如果 A A A 的秩远大于 2 2 2,就比如实际图像,那么 A A A 就会是很多秩一项相加,我们希望最小的项足够小 —— 它们可以被丢弃而不会影响视觉的质量,这时图像压缩就变为有损的了,但是好的图像压缩人的视觉几乎是无法察觉的。
问题变成了:SVD 的正交基要如何选择?

三、SVD 的特征向量

大部分图像的特征向量并不正交,而且特征向量 x 1 , x 2 \boldsymbol x_1,\boldsymbol x_2 x1,x2 只提供一组向量,我们想要两组向量( u ′ s \boldsymbol u's us v ′ s \boldsymbol v's vs)。这两个问题的解决方法正是 SVD 的思想:
使用 A A T AA^T AAT 的特征向量 u \boldsymbol u u A T A A^TA ATA 的特征向量 v \boldsymbol v v
因为 A A T AA^T AAT A T A A^TA ATA 自动就是对称的(通常并不相等!),所以特征向量 u ′ s \boldsymbol u's us 是一组正交向量,特征向量 v ′ s \boldsymbol v's vs 是另一组正交向量,我们可以并且需要将它们单位化: ∣ ∣ u i ∣ ∣ = 1 ||\boldsymbol u_i||=1 ∣∣ui∣∣=1 ∣ ∣ v i ∣ ∣ = 1 ||\boldsymbol v_i||=1 ∣∣vi∣∣=1,这样我们的秩 2 2 2 矩阵就是 A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T A=\sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T A=σ1u1v1T+σ2u2v2T。其中 σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2 这些数字的大小将决定它们在压缩过程中是否可以被忽略。我们保留大的 σ ′ s \sigma's σs,丢弃小的 σ ′ s \sigma's σs
SVD 中的 u ′ s \boldsymbol u's us 称为左奇异值向量(left singular vectors),它们是 A A T AA^T AAT 的单位特征向量; v ′ s \boldsymbol v's vs 称为右奇异值向量(right singular vectors),它们是 A T A A^TA ATA 的单位特征向量。其中 σ ′ s \sigma's σs 就是奇异值(singular values),等于 A A T AA^T AAT A T A A^TA ATA 特征值的平方根:

SVD 的选择 A A T u i = σ i 2 u i A T A v i = σ i 2 v i A v i = σ i u i ( 7.1.1 ) {\color{blue}AA^T\boldsymbol u_i=\sigma_i^2\boldsymbol u_i\kern 10ptA^TA\boldsymbol v_i=\sigma_i^2\boldsymbol v_i\kern 10ptA\boldsymbol v_i=\sigma_i\boldsymbol u_i}\kern 45pt(7.1.1) AATui=σi2uiATAvi=σi2viAvi=σiui(7.1.1)

在例 3 中(嵌入的方块矩阵),下面是对称矩阵 A A T AA^T AAT A T A A^TA ATA A A T = [ 1 0 1 1 ] [ 1 1 0 1 ] = [ 1 1 1 2 ] A T A = [ 1 1 0 1 ] [ 1 0 1 1 ] = [ 2 1 1 1 ] AA^T=\begin{bmatrix}1&0\\1&1\end{bmatrix}\begin{bmatrix}1&1\\0&1\end{bmatrix}=\begin{bmatrix}\pmb1&\pmb1\\\pmb1&\pmb2\end{bmatrix}\kern 20ptA^TA=\begin{bmatrix}1&1\\0&1\end{bmatrix}\begin{bmatrix}1&0\\1&1\end{bmatrix}=\begin{bmatrix}\pmb2&\pmb1\\\pmb1&\pmb1\end{bmatrix} AAT=[1101][1011]=[1112]ATA=[1011][1101]=[2111]它们的特征值都是 1 1 1,所以 λ 1 λ 2 = 1 \lambda_1\lambda_2=1 λ1λ2=1,它们的迹(对角元素之和)都是 3 3 3 det ⁡ [ 1 − λ 1 1 2 − λ ] = λ 2 − 3 λ + 1 = 0 得到 λ 1 = 3 + 5 2 和 λ 2 = 3 − 5 2 \det\begin{bmatrix}1-\lambda&1\\1&2-\lambda\end{bmatrix}=\lambda^2-3\lambda+1=0\kern 5pt得到\kern 5pt\lambda_1=\frac{3+\sqrt5}{2}\kern 5pt和\kern 5pt\lambda_2=\frac{3-\sqrt5}{2} det[1λ112λ]=λ23λ+1=0得到λ1=23+5 λ2=235 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 的平方根是 σ 1 = 5 + 1 2 \sigma_1=\displaystyle\frac{\sqrt5+1}{2} σ1=25 +1 σ 2 = 5 − 1 2 \sigma_2=\displaystyle\frac{\sqrt5-1}{2} σ2=25 1 σ 1 σ 2 = 1 \sigma_1\sigma_2=1 σ1σ2=1。最接近 A A A 的秩一矩阵是 σ 1 u 1 v 1 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T σ1u1v1T,误差仅为 σ 2 ≈ 0.6 \sigma_2\approx0.6 σ20.6,这个是理论最小值。
A A T AA^T AAT A T A A^TA ATA 标准正交特征向量是 u 1 = [ 1 σ 1 ] u 2 = [ σ 1 − 1 ] v 1 = [ σ 1 1 ] v 2 = [ 1 − σ 1 ] 全部除以 1 + σ 1 2 ( 7.1.2 ) \boldsymbol u_1=\begin{bmatrix}1\\\sigma_1\end{bmatrix}\kern 10pt\boldsymbol u_2=\begin{bmatrix}\sigma_1\\-1\end{bmatrix}\kern 10pt\boldsymbol v_1=\begin{bmatrix}\sigma_1\\1\end{bmatrix}\kern 10pt\boldsymbol v_2=\begin{bmatrix}1\\-\sigma_1\end{bmatrix}\kern 10pt全部除以\kern 3pt\sqrt{1+\sigma_1^2}\kern 20pt(7.1.2) u1=[1σ1]u2=[σ11]v1=[σ11]v2=[1σ1]全部除以1+σ12 (7.1.2)实际生活中这些计算都是由计算机完成的!(MATLAB 中可以使用 svd(A) 进行奇异值分解。)我们可验证一下 σ 1 u 1 v 1 T + σ 2 u 2 v 2 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T σ1u1v1T+σ2u2v2T 是否可以正确的重构矩阵 A A A

A = [ u 1 u 2 ] [ σ 1 σ 2 ] [ v 1 T v 2 T ] \boxed{A=\begin{bmatrix}\boldsymbol u_1&\boldsymbol u_2\end{bmatrix}\begin{bmatrix}\sigma_1&\\&\sigma_2\end{bmatrix}\begin{bmatrix}\boldsymbol v_1^T\\\boldsymbol v_2^T\end{bmatrix}} A=[u1u2][σ1σ2][v1Tv2T] 或更简单的 A [ v 1 v 2 ] = [ σ 1 u 1 σ 2 u 2 ] ) ( 7.1.3 ) \boxed{A\begin{bmatrix}\boldsymbol v_1&\boldsymbol v_2\end{bmatrix}=\begin{bmatrix}\sigma_1\boldsymbol u_1&\sigma_2\boldsymbol u_2\end{bmatrix})}\kern 30pt(7.1.3) A[v1v2]=[σ1u1σ2u2])(7.1.3)

重点:关键点是图像并不都是趋于低秩,大部分图像都是满秩的,但是它们有低有效秩(low effective rank)。这意味着:很多奇异值都很小,它们可以设置成零,我们传输的是一个低秩的近似。

例4】假设旗帜是两种不同颜色的三角形,左下角的三角形都是 1 1 1,右上角的三角形都是 0 0 0,主对角线都是 1 1 1。下面是当 n = 4 n=4 n=4 时的图像矩阵,它是满秩的 r = 4 r=4 r=4,所以它可逆: 三角形 旗帜矩阵 A = [ 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 ] 和 A − 1 = [ 1 0 0 0 − 1 1 0 0 0 − 1 1 0 0 0 − 1 1 ] \begin{array}{l}\pmb{三角形}\\\pmb{旗帜矩阵}\end{array}\kern 10ptA=\begin{bmatrix}\pmb1&0&0&0\\\pmb1&\pmb1&0&0\\\pmb1&\pmb1&\pmb1&0\\\pmb1&\pmb1&\pmb1&\pmb1\end{bmatrix}\kern 5pt和\kern 5ptA^{-1}=\begin{bmatrix}\kern 7pt1&\kern 7pt0&\kern 7pt0&0\\-1&\kern 7pt1&\kern 7pt0&0\\\kern 7pt0&-1&\kern 7pt1&0\\\kern 7pt0&\kern 7pt0&-1&1\end{bmatrix} 三角形旗帜矩阵A= 1111011100110001 A1= 1100011000110001 由于矩阵满秩,所以 A A A 有一组 n n n 个奇异值 σ \sigma σ(都是正数),SVD 会产生 n n n 个秩一项 σ i u i v i T \sigma_i\boldsymbol u_i\boldsymbol v_i^T σiuiviT,完美的重构需要全部的 n n n 项。
在压缩过程中小的 σ \sigma σ 可以被丢弃,它们不会明显影响图片的质量。我们要理解并画出当 n = 4 n=4 n=4 时的这些 σ \sigma σ 以及更大的 n n n。注意例 3 是例 4 这个三角形矩阵当 n = 2 n=2 n=2 时的特例。
下面我们手动计算,从 A A T AA^T AAT 开始(计算机处理会不同): A A T = [ 1 1 1 1 1 2 2 2 1 2 3 3 1 2 3 4 ] 和 ( A A T ) − 1 = ( A − 1 ) T A − 1 = [ 2 − 1 0 0 − 1 2 − 1 0 0 − 1 2 − 1 0 0 − 1 1 ] ( 7.1.4 ) AA^T=\begin{bmatrix}1&1&1&1\\1&2&2&2\\1&2&3&3\\1&2&3&4\end{bmatrix}\kern 10pt和\kern 10pt(AA^T)^{-1}=(A^{-1})^TA^{-1}=\begin{bmatrix}\kern 7pt\pmb2&-1&\kern 7pt0&\kern 7pt0\\-1&\kern 7pt\pmb2&-1&\kern 7pt0\\\kern 7pt0&-1&\kern 7pt\pmb2&-1\\\kern 7pt0&\kern 7pt0&-1&\kern 7pt\pmb1\end{bmatrix}\kern 15pt(7.1.4) AAT= 1111122212331234 (AAT)1=(A1)TA1= 2100121001210011 (7.1.4)这个 − 1 , 2 , − 1 -1,2,-1 1,2,1 的逆矩阵被引进是因为它的特征值的形式是 2 − 2 cos ⁡ θ 2-2\cos\theta 22cosθ,所以我们可以得到 A A T AA^T AAT λ ′ s \lambda's λs A A A σ ′ s \sigma's σs λ = 1 2 − 2 cos ⁡ θ = 1 4 sin ⁡ 2 ( θ / 2 ) 得到 σ = λ = 1 2 sin ⁡ ( θ / 2 ) ( 7.1.5 ) \lambda=\frac{1}{2-2\cos\theta}=\frac{1}{4\sin^2(\theta/2)}\kern 10pt得到\kern 10pt\sigma=\sqrt\lambda=\frac{1}{2\sin(\theta/2)}\kern 25pt(7.1.5) λ=22cosθ1=4sin2(θ/2)1得到σ=λ =2sin(θ/2)1(7.1.5) n n n 个不同的角度 θ \theta θ 0 0 0 ~ π π π 之间等距离的,注意这个三对角矩阵最后一个元素是 1 1 1 而不是 2 2 2,此时等距的点有 2 n 2n 2n 个,若为 2 2 2 时等距点有 n n n 个,这个例子非常特殊: θ = π 2 n + 1 , 3 π 2 n + 1 , ⋯ , ( 2 n − 1 ) π 2 n + 1 ( n = 4 时包括 θ = 3 π 9 ,此时 2 sin ⁡ θ 2 = 1 ) \theta=\frac{π}{2n+1},\frac{3π}{2n+1},\cdots,\frac{(2n-1)π}{2n+1}\kern 10pt\Big(n=4\,时包括\,\theta=\frac{3π}{9},此时\,2\sin\frac{\theta}{2}=1\Big) θ=2n+1π,2n+13π,,2n+1(2n1)π(n=4时包括θ=93π,此时2sin2θ=1)这个特殊案例得到了当 n = 4 n=4 n=4 A A T AA^T AAT 的一个特征值 λ = 1 \lambda=1 λ=1,所以 σ = λ = 1 \sigma=\sqrt\lambda=1 σ=λ =1 A A A 的一个奇异值,当向量 u = ( 1 , 1 , 0 , − 1 ) \boldsymbol u=(1,1,0,-1) u=(1,1,0,1) 时,有 A A T u = u AA^T\boldsymbol u=\boldsymbol u AATu=u,这是一个真正的特例。
重点是画出 A A A n n n 个奇异值的图形,这些数字是逐渐减小的(不像 A A A 的特征值,都是 1 1 1),但是减小的不是很陡峭。所以 SVD 只是适度的压缩这个三角形旗帜。对于希尔伯特矩阵压缩效果非常好。

在这里插入图片描述

四、例题

例5】MATLAB 指令 A = rand(20, 40) 和 B = randn(20, 40) 会生成 20×40 的随机矩阵: A A A 中的元素是 0 0 0 1 1 1 之间均匀分布的;B 中的元素是 “钟形” 正态分布。使用 MATLAB 中的 svd 命令,画出奇异值 σ 1 σ_1 σ1 σ 20 σ_{20} σ20
解: MATLAB 代码如下:

% 生成矩阵并计算奇异值
A = rand(20, 40);
s = svd(A);% 绘制半对数坐标图
figure;
semilogy(s, '-o', 'LineWidth', 1.5, 'MarkerSize', 6); % 这个函数是绘制半对数坐标的函数,横轴是线性,纵轴是对数;%-o 是圆圈标记;MarkerSize 是这个圆圈标记的大小
xlabel('序号 (k)');
ylabel('\sigma_k (对数刻度)');
title('A=rand(20,40)的奇异值分布');
axis tight;											  % 自动调整坐标轴范围,使数据内容紧密贴合坐标轴边界
grid on;% 生成20×40的随机矩阵(元素服从标准正态分布)
B = randn(20, 40);% 计算奇异值分解(Singular Value Decomposition)
[U, S, V] = svd(B);% 提取奇异值(S矩阵的对角线元素)
singular_values = diag(S);% 绘制奇异值分布图(对数坐标系)
figure;
semilogy(singular_values, 'bo-', 'LineWidth', 1.5);	% bo 表示蓝色的圆圈,- 代表实线
grid on;
xlabel('序号 (k)');
ylabel('\sigma_k(对数刻度)');
title('B=randn(20,40)的奇异值分布');
axis tight;

运行结果如下:

图片1地址![](https://img-blog.csdnimg.cn/图片2地址

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

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

相关文章

Java 大视界 -- Java 大数据在智慧环保污染源监测与预警中的应用(104)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

「慢思考」机理分析:从雪球误差到正确推理概率

在大语言模型(LLMs)的发展历程中, Scaling Laws [1] 一直是推动性能提升的核心策略。研究表明,随着模型规模和训练数据的增长,LLMs 的表现会不断优化 [2]。然而,随着训练阶段规模的进一步扩大,性…

面试问题——如何解决移动端1px 边框问题?

面试问题——如何解决移动端1px 边框问题? 最近,不少小伙伴向我反映,他们在面试中频繁被问到关于1px边框的问题。这个看似老生常谈的话题,没想到在面试中的出现率依然这么高,着实让我有些意外。对于那些对这个问题感到…

全星研发项目管理APQP软件系统:汽车电子与半导体行业的研发管理利器

全星研发项目管理APQP软件系统:汽车电子与半导体行业的研发管理利器 1. 集成化管理优势 1.1 数据一致性 无缝数据流转:集成平台确保数据在不同模块间无缝流转,避免因工具切换导致的数据错误和重复工作。案例:某汽车电子企业使用…

Cascadeur 技术浅析(二):物理模拟

Cascadeur 的物理模拟算法是其核心功能之一,旨在通过模拟真实世界的物理规律,使角色动画更加自然和逼真。 1. 刚体动力学(Rigid Body Dynamics) a. 基本原理 刚体动力学用于模拟角色的骨骼和关节运动,假设角色的每个部分都是刚体(即不会发生形变的物体)。通过应用牛顿…

点云处理入门--PointNetPointNet++论文与代码详解

基础知识 点云数据: 点云是一种通过三维扫描设备或计算机图形学技术获取的三维空间数据,通常由一系列点组成,每个点包含其在三维空间中的坐标(如 x,y,z),有时还可能包含颜色、强度等附加信息。 介绍几种常…

Tomcat介绍

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定&…

DeepSeek-R1-Zero:基于基础模型的强化学习

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列四DeepSeek大模型技术系列四》DeepSeek-…

Redis初识

Redis是什么 Redis是一个在内存中存储数据的中间件,它可以用于作为数据库,用于作为数据的缓存,市面上作为数据缓存的不止Redis一家,但为啥我们要学习Redis呢?因为Redis有一些特性和优点,让Reids在市面上脱…

DeepSeek今日连开3源!针对优化的并行策略,梁文锋本人参与开发

DeepSeek开源周第四天,直接痛快「1日3连发」,且全都围绕一个主题: 优化并行策略。 DualPipe:一种创新的双向流水线并行算法,能够完全重叠前向和后向计算-通信阶段,并减少“流水线气泡”。它通过对称的微批…

打印九九乘法表

打印九九乘法表 package struct; ​ public class ForDemo04 {public static void main(String[] args) { ​for (int i 1; i < 9; i) {//System.out.println(1"*"i""(1*i));for (int j 1; j < i; j) {System.out.print(i"*"j"&qu…

机器学习的起点:线性回归Linear Regression

机器学习的起点&#xff1a;线性回归Linear Regression 作为机器学习的起点&#xff0c;线性回归是理解算法逻辑的绝佳入口。我们从定义、评估方法、应用场景到局限性&#xff0c;用生活化的案例和数学直觉为你构建知识框架。 回归算法 一、线性回归的定义与核心原理 定义&a…

DeepSeek 提示词:常见指令类型

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

查询NFT图片地址

前言 有人给我发了nft&#xff0c;但是没有图片&#xff0c;我就很纳闷为什么&#xff0c;所以想一探究竟 解决思路 先说下环境吧 Sepolia 测试网 metamask钱包 需要获取nft的合约地址和token id 钱包内 nft可以查得到 思路&#xff1a; 我的理解就是ERC721有标准的…

一个滑块可变色的Seekbar

因项目需要&#xff0c;做一个如下图的滑动条&#xff0c;要求如下&#xff1a; 1、滑块跟着进度条改变颜色 2、滑块有白色边和内部颜色组成 大体思路&#xff0c;就是背景需要UI按照需求提供&#xff0c;然后变色时&#xff0c;根据滑动回调动态设置对应的颜色。 直接上代码…

重大更新!锂电池剩余寿命预测新增 CALCE 数据集

往期精彩内容&#xff1a; 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门&#xff01;锂电池剩余寿命预测&#xff08;Python&#xff09;-CSDN博客 超强预测模型&#xff1a;二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解&#xff0c;BiLSTM-Attention预测模型…

实时时钟(RTC)/日历芯片PCF8563的I2C读写驱动(2):功能介绍

0 参考资料 PCF8563数据手册&#xff08;第 11 版——2015 年 10 月 26 日&#xff09;.pdf 1 功能介绍 1.1 实时时钟&#xff08;RTC&#xff09;/日历 &#xff08;1&#xff09;PCF8563支持实时时钟&#xff08;RTC&#xff09;&#xff0c;提供时、分、秒信息。对应寄存器…

Xcode如何高效的一键重命名某个关键字

1.选中某个需要修改的关键字&#xff1b; 2.右击&#xff0c;选择Refactor->Rename… 然后就会出现如下界面&#xff1a; 此时就可以一键重命名了。 还可以设置快捷键。 1.打开Settings 2.找到Key Bindings 3.搜索rename 4.出现三个&#xff0c;点击一个地方设置后其…

Grok 3 的崛起:AI 的新时代

AI 领域再次震动&#xff0c;一款全新的深度思考大型语言模型正式亮相。它不仅碾压了现有的各项基准测试&#xff0c;还成功登顶 LM Marina 排行榜&#xff0c;夺得第一名。这款 AI 不是别人&#xff0c;正是埃隆马斯克那款“基于事实、敢言无忌”的 Grok 3——一个号称既极为聪…

ros安装rqt_joint_trajectory_controller

有时候&#xff0c;我们可以看到别人的代码里面有这个&#xff0c;但是这个是需要安装的。 <node name"gui_controller" pkg"rqt_joint_trajectory_controller" type"rqt_joint_trajectory_controller" />sudo apt-get install ros-noeti…