目录
- 基本概念
- 矩阵基础运算
- 解方程组
- 特征向量与特征值
一、基本概念
标量定义:
标量是只有大小没有方向的量。在数学中,它通常是一个实数或复数。
通俗理解:
想象你有5个苹果。这个数字"5"就是一个标量。它只告诉你有多少苹果,但不告诉你这些苹果放在哪里
向量定义:
向量是具有大小和方向的量。在数学中,它通常表示为一个有序的数字列表,如二维或三维空间中的点
通俗理解:想象你在一个大房间里,你想告诉你的朋友一个宝藏的位置。你可以说:"从门口开始,走5步向前,然后走3步向右。这个"5步向前3步向右"就像一个向量,它有方向和距离
矩阵定义:
矩阵是一个二维数组,其中的每个元素都是一个标量。它可以表示线性变换
通俗理解:想象你有一个秘密地图,上面有很多宝藏的位置。为了整齐地记录所有的位置,你决定用一个网格或表格来写下所有的"向前和向右"的步数。这个表格就像一个矩阵,它帮助你整齐地记录信息
张量定义:
张量是一个可以在多个方向上有分量的数学对象。标量是零阶张量,向量是一阶张量,矩阵是二阶张量。更高阶的张量可以看作是多维数组
通俗理解:想象你不仅在一个房间里找宝藏,而且在一个大楼里。这时,你不仅要告诉你的朋友向前走多少步、向右走多少步,还要告诉他上或下走多少楼梯。如果你用一个更大的表格来记录这些信息,其中包括向前、向右和上下的步数,这就像一个张量。张量就是一个更高级的表格,可以记录更多的信息
二、概念 Python案例实战
- 创建向量、矩阵、张量
python
import numpy as np
#创建向量(一维)
vactor = np.array([1,2,3,4,5])
#np.linalg.norm()计算的是该向量的范数 计算向量的长度或者矩阵的某种"大小"
vactor_norm = np.linalg.norm(vactor)
print(vactor_norm)
print(vactor)
#创建矩阵(二维)
matrix = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
matrix_norm = np.linalg.norm(matrix)
print(matrix_norm)
print(matrix)
#创建张量(三维)
#如果读取一张图片,如果该图片有rgb三个通道,就会属于张量,如果就一个通道(黑白灰度图像),,可以转为矩阵格式
tensor = np.array([[[1,2],[3,4]],
[[5,6],[7,8]],
[[9,10],[12,13]]
])
tensor_norm = np.linalg.norm(tensor)
print(tensor_norm)
print(tensor)
- 将Numpy矩阵保存成本地图像
python
#将矩阵保存成本地图像
#创建一个大小为224x224的二维矩阵,值为0-255之间
two_d_matrix = np.random.randint(0,256,(224,224),dtype=np.uint8)
#创建一个大小为3x224x224的三维矩阵,值为0-255之间
three_d_matrix = np.random.randint(0,256,(3,224,224),dtype=np.uint8)
#在OpenCV中,图像的通道顺序为高x 宽x 通道数
three_d_matrix_transposed = three_d_matrix.transpose(1,2,0)
#将画面显示出来
cv2.imshow("two_d_matrix",two_d_matrix)
cv2.imshow("three_d_matrix",three_d_matrix_transposed)
cv2.waitKey(0)
#使用OpenCV将图片保存在本地
cv2.imwrite("three_d_matrix.png",three_d_matrix_transposed)
cv2.imwrite("two_d_matrix.png",two_d_matrix)
运行如图:
##三、矩阵基础运算
- 标量与矩阵的乘法
案例实战,使用标量和矩阵相乘来调整画面的对比度实现图像增强:
python
import cv2
import numpy as np
#读取图像
image= cv2.imread("./11.jpg")
#增加对比度
increased_contrast = cv2.convertScaleAbs(image,alpha=1.5)
#减少对比度
decreased_contrast = cv2.convertScaleAbs(image,alpha=0.5)
#将图像进行横向拼接
combined_image = cv2.hconcat([image,increased_contrast,decreased_contrast])
#显示图片
cv2.imshow("Originaal - increased_contrast - decreased_contrast",combined_image)
cv2.waitKey(0)
结果为:
案例实战,使用python代码实现以下计算:
python
#定义矩阵A和B
A = np.array([[1,2],
[3,4]])
B = np.array([[5,6],
[7,8]])
#定义标量C
C = 3
#标量与矩阵的乘法
scalar_matrix_multiplication = C*A
#矩阵的加法
matrix_addition = A+B
print(scalar_matrix_multiplication,'\n',matrix_addition)
三、解方程组
使用python解以下方程组:
python
import numpy as np
#创建系数矩阵
A = np.array([[1,2,3],
[1,6,7],
[1,10,6]])
#创建常数向量
B = np.array([5,9,8])
#解方程
x = np.linalg.solve(A,B)
#打印结果
print("解:",x)
四、特征向量与特征值
特征值定义:
与特征向量相对应的标量λ称为特征值。 它表示在特定的特征向量方向上,变换的缩放比例。
想象一个拉伸机,你放入一根箭头,拉伸机的作用下,这根箭头可能会被拉长、缩短或者保持原长,但方向不变。这个"拉伸"或者"缩短"的倍数,就是特征值。特征值反映了这个变换增强或减弱了向量的程度
特征向量定义:
如果一个非零向量v在一个线性变换下的效果仅仅是被伸缩(缩放或拉伸),而方向不变,那么这个向量被称为特征向量。
那根被拉伸后方向不变的箭头,就是特征向量。它是一个特殊的向量,它在矩阵变换下只是被伸缩,但不改变其方向。可以指明变换的主要方向
求特征值与特征向量
求解以下矩阵的特征值与特征向量:
使用Python算出结果:
python
import numpy as np
#定义矩阵
A = np.array([[4,1],
[2,3]])
#使用Numpy求特征值和特征向量
eigenvalues,eigenvectors = np.linalg.eig(A)
print("特征值:",eigenvalues)
print("特征向量:",eigenvectors)
结果为:
特征向量与特征值的应用案例
图像的 SVD分解
对一幅图像的SVD分解为三个部分:
U 矩阵:包含了"左奇异向量",可以想象成是一组基础的图像模式。
Σ矩阵:包含了"奇异值",表明了每个图像模式的重要性或权重。较大的奇
异值对应于图像中更重要的特征。
V 矩阵:包含了"右奇异向量",它与U矩阵类似,但从不同的角度描述了图
像的特征。
通过这种分解,图像转化成一系列的模式和对应的权重。可通过用较少的数据
来描述一幅图像,同时保留其关键特征
使用Python代码实现:
python
import cv2
import numpy as np
#读取图像
image = cv2.imread("./11.jpg",0)
#对图像进行svd分解 astype转成浮点数再进行分解
U,S,V = np.linalg.svd(image.astype(np.float64),full_matrices=False)
#定义要保留的奇异值数量
k = 10
s_k = np.diag(S[:k])
#重构图像
compressed_image = np.dot(U[:,:k],np.dot(s_k,V[:k,:]))
compressed_image = np.clip(compressed_image,0,255).astype(np.uint8) #clip限制像素范围
#显示图像
cv2.imshow("Original image",image)
cv2.imshow("compressed image",compressed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
使用的特征值越多,图像就会越清晰
.