碼農眼中的數學之~矩陣專欄(附Numpy講解)

来源:https://www.cnblogs.com/dotnetcrazy/archive/2018/07/15/9314518.html
-Advertisement-
Play Games

2.矩陣專欄¶ 吐槽一下:矩陣本身不難,但是矩陣的寫作太蛋疼了 (⊙﹏⊙)汗 還好有Numpy,不然真的崩潰了... LaTex有沒有一個集成了很多常用公式以及推導或者含題庫的線上編輯器? 代碼褲子:https://github.com/lotapp/BaseCode 線上編程系:https://m ...


 

2.矩陣專欄

吐槽一下:矩陣本身不難,但是矩陣的寫作太蛋疼了 (⊙﹏⊙)汗 還好有Numpy,不然真的崩潰了...

LaTex有沒有一個集成了很多常用公式以及推導或者含題庫的線上編輯器?

代碼褲子:https://github.com/lotapp/BaseCode

線上編程系:https://mybinder.org/v2/gh/lotapp/BaseCode/master

數學基礎:https://www.cnblogs.com/dotnetcrazy/p/9294292.html

Numpy基礎:https://www.cnblogs.com/dotnetcrazy/p/9309555.html

2.1.矩陣的定義

矩陣:是一個按照長方陣列排列的複數或實數集合。

通俗講就是:把數排成m行n列後,然後用中括弧把它們括住,這種形式的組合就是矩陣了~ eg:

$\begin{bmatrix} &a_{11}&a_{12}&a_{13}&...&a_{1n} \\ &a_{21}&a_{22}&a_{23}&...&a_{2n} \\ &a_{31}&a_{32}&a_{33}&...&a_{3n} \\ &\vdots&\vdots&\vdots&\ddots&\vdots\\ &a_{m1}&a_{m2}&a_{m3}&...&a_{mn} \\ \end{bmatrix}$

比如上面這個示例就是一個m × n的矩陣(m行n列的矩陣),如果m=n那麼就叫做n階方陣,eg:

$\begin{bmatrix} 1&2&3 \\ 4&5&6 \\ 7&8&9 \end{bmatrix}$

這個就是3階方陣


如果回到中學,老師肯定都是通過一次方程組來引入矩陣(逆天的老師是這麼講的):

$\begin{cases}x_1+x_2=-1\\2x_1-x_2=4\\3x_1+5x_2=-7\\\end{cases}$ ==> $\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}-1\\4\\-7\end{bmatrix}$

如果你方程組都忘記怎麼解的話...好吧還是說下吧:“比如這題,可以先把x2移到右邊,這樣x1就等於一個表達式了(x1=-x2-1),然後帶入第二個表達式就可以解出x1和x2了,一次的其實兩個表達式就可以解出了,剩下的你可以把值帶進去驗證一下”

2.2.矩陣的運算(含冪運算)

2.2.1.加、減

加減比較簡單,就是對應元素相加減 (只有行列都相同的矩陣才可以進行)

就不用麻煩的LaTex一行行打了,咱們用更方便的 NumPy 來演示一下矩陣加法(不懂代碼的直接看結果,不影響閱讀的)

Numpy有專門的矩陣函數(np.mat),用法和ndarray差不多,我們這邊使用經常使用ndarray類型,基礎忘記了可以去查看一下:Numpy基礎

擴展:矩陣的加法運算滿足交換律:A + B = B + A (乘法不行)

In [1]:
import numpy as np
In [2]:
# 創建兩個集合
A = np.arange(1,10).reshape((3,3))
B = np.arange(9).reshape((3,3))

print(A)
print("-"*5)
print(B)
 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
-----
[[0 1 2]
 [3 4 5]
 [6 7 8]]
In [3]:
# 加法
A + B
Out[3]:
array([[ 1,  3,  5],
       [ 7,  9, 11],
       [13, 15, 17]])
In [4]:
# 和A+B相等
B + A
Out[4]:
array([[ 1,  3,  5],
       [ 7,  9, 11],
       [13, 15, 17]])
In [5]:
# 減法
A - B
Out[5]:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
In [6]:
################ 變化來了 ################
In [7]:
# 之前說過 ”只有行列都相同的矩陣才可以進行“ 來驗證一下
# 創建一個2行3列的矩陣
C = np.arange(6).reshape((2,3))
D = np.arange(6).reshape((3,2))

print(C)
print("-"*5)
print(D)
 
[[0 1 2]
 [3 4 5]]
-----
[[0 1]
 [2 3]
 [4 5]]
In [8]:
# 2行3列的矩陣 + 3行2列的矩陣
C + D # 不同形狀的矩陣不能進行加運算
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-bc97e29f7e31> in <module>()
      1 # 2行3列的矩陣 + 3行2列的矩陣
----> 2C + D # 不同形狀的矩陣不能進行加運算

ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 
In [9]:
C - D # 不同形狀的矩陣不能進行減運算
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-9-ca5169d0bf6c> in <module>()
----> 1C - D # 不同形狀的矩陣不能進行減運算

ValueError: operands could not be broadcast together with shapes (2,3) (3,2) 
 

2.2.2.數乘、數除

這個也比較簡單,就是和每個元素相乘,eg:2×A,A原本的每一個元素都擴大了兩倍

數除其實就是乘以倒數(1/x)

In [10]:
print(A)
 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
In [11]:
# 比如2×A,A原本的每一個元素都擴大了兩倍
2 * A
Out[11]:
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])
In [12]:
print(A)
 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
In [13]:
# 友情提醒:Numpy裡面的運算基本上都是針對每一個元素
A / 2
Out[13]:
array([[0.5, 1. , 1.5],
       [2. , 2.5, 3. ],
       [3.5, 4. , 4.5]])
 

2.2.3.矩陣乘法

矩陣乘法還是要用LaTex演示一下的,不然有些朋友可能還是覺得比較抽象:(大家有什麼好用的LaTex線上編輯器可以推薦的)

拿上面那個方程組來演示一下:

$\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix} ==> \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases}$

稍微變化一下就更形象了:

$\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1&y_1\\x_2&y_2\end{bmatrix} ==> \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases} \begin{cases}y_1+y_2\\2y_1-x_2\\3y_1+5y_2\end{cases}==>\begin{bmatrix}x_1+x_2&y_1+y_2\\2x_1-x_2&2y_1-y_2\\3x_1+5x_2&3y_1+5y_2\end{bmatrix}$

舉個簡單的例子:A×B

$\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} 4&3 \\2&1 \end{bmatrix}=\begin{bmatrix} 1*4+2*2&1*3+2*1 \\3*4+4*2&3*3+4*1 \end{bmatrix}=\begin{bmatrix} 8&5 \\20&13 \end{bmatrix}$

以後記不得怎麼乘就自己推一下,值得註意的是:

兩個矩陣的乘法僅當第一個矩陣A的列數(column)和另一個矩陣B的行數(row)相等才可以進行計算

你這樣想就記得了:$\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} x_1 \end{bmatrix} 還原成方程組就是這樣\begin{cases}1*x_1+2*?\\3*x_1+4*?\end{cases}\\這是什麼鬼?至少得這樣吧:\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} x_1 \\x_2 \end{bmatrix}$

In [14]:
# 通過代碼看一看
A = np.array([[1,2],[3,4]])
B = np.array([[4,3],[2,1]])

print(A)
print("-"*5)
print(B)
 
[[1 2]
 [3 4]]
-----
[[4 3]
 [2 1]]
In [15]:
# 註意一下,Numpy裡面的乘法預設是每個數對應相乘
# 如果是矩陣相乘可以使用dot()方法
# 或者你創建矩陣對象,這樣×預設就是矩陣乘法了

A.dot(B) # 矩陣A×矩陣B
Out[15]:
array([[ 8,  5],
       [20, 13]])
 

程式驗證了我們上面的運算結果,還得註意一下:

A×BB×A是不一樣的,eg:B×A

$\begin{bmatrix} 4&3 \\2&1 \end{bmatrix}\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}=\begin{bmatrix} 4*1+3*3&4*2+3*4 \\2*1+1*3&2*2+1*4 \end{bmatrix}=\begin{bmatrix} 13&20 \\5&8 \end{bmatrix}$

如果你乘著乘著就忘記到底怎麼乘,就把右邊的矩陣換成x1,x2,然後就會了

In [16]:
print(A)
print("-"*5)
print(B)
 
[[1 2]
 [3 4]]
-----
[[4 3]
 [2 1]]
In [17]:
B.dot(A) # 矩陣B×矩陣A
Out[17]:
array([[13, 20],
       [ 5,  8]])
In [18]:
################ 變化來了 ################
In [19]:
# 來驗證一下”兩個矩陣的乘法僅當第一個矩陣A的列數(column)和另一個矩陣D的行數(row)相等才可以進行計算“
print(A)
print("-"*5)
print(D)
 
[[1 2]
 [3 4]]
-----
[[0 1]
 [2 3]
 [4 5]]
In [20]:
# A有2列 D有3行
A.dot(D) # 不能乘
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-20-c1a9f22a6f8d> in <module>()
      1 # A有2列 D有3行
----> 2A.dot(D) # 不能乘

ValueError: shapes (2,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
In [21]:
# 你反過來就符合A的列數=D的行數了
D.dot(A)
Out[21]:
array([[ 3,  4],
       [11, 16],
       [19, 28]])
 

2.2.4.冪乘、冪運算

冪乘比較簡單,就是每個元素開平方,不一定是方陣

必須是方陣才能進行冪運算,比如A²=A×A(矩陣相乘前提:第一個矩陣A的行=第二個矩陣A的列==>方陣

In [22]:
print(A)
print("-"*5)
print(C)
 
[[1 2]
 [3 4]]
-----
[[0 1 2]
 [3 4 5]]
In [23]:
# 冪乘(每個元素開平方) 
np.power(A,2) # 使用 A**2也一樣
Out[23]:
array([[ 1,  4],
       [ 9, 16]])
In [24]:
# 冪乘(不一定是方陣) 
np.power(C,2)
Out[24]:
array([[ 0,  1,  4],
       [ 9, 16, 25]])
In [25]:
################ 方陣冪運算 ################
In [26]:
# A*A*A
np.linalg.matrix_power(A,3)
Out[26]:
array([[ 37,  54],
       [ 81, 118]])
In [27]:
# 不是方陣就over
np.linalg.matrix_power(C,3)
 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-73f04ef7b54c> in <module>()
      1 # 不是方陣就over
----> 2np.linalg.matrix_power(C,3)

~/anaconda3/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in matrix_power(M, n)
    137     M = asanyarray(M)
    138     if M.ndim != 2 or M.shape[0] != M.shape[1]:
--> 139raise ValueError("input must be a square array")
    140     if not issubdtype(type(n), N.integer):
    141         raise TypeError("exponent must be an integer")

ValueError: input must be a square array
 

來個小結 + 擴展

矩陣的加法運算滿足交換律:A + B = B + A

矩陣的乘法滿足結合律和對矩陣加法的分配律:

結合律:(AB)C = A(BC)

左分配律:(A + B)C = AC + BC

右分配律:C(A + B) = CA + CB

矩陣的乘法與數乘運算之間也滿足類似結合律的規律;與轉置之間則滿足倒置的

分配律:c(A + B) = cA + cB

結合律:c(AB) = (cA)B = A(cB)

矩陣乘法不滿足交換律 一般來說,矩陣A及B的乘積AB存在,但BA不一定存在,即使存在,大多數時候AB ≠ BA


2.3.特殊矩陣

2.3.1.零矩陣

零矩陣就是所有的元素都是0

$ \begin{bmatrix} 0&0&0 \\ 0&0&0 \\ 0&0&0 \end{bmatrix} $

同樣的:全1矩陣就是所有元素都是1

$ \begin{bmatrix} 1&1&1 \\ 1&1&1 \\ 1&1&1 \end{bmatrix} $

In [1]:
import numpy as np
In [2]:
# 一維
# 可以指定類型 np.zeros(5,dtype=int)
np.zeros(5) # 完整寫法:np.zeros((5,))
Out[2]:
array([0., 0., 0., 0., 0.])
In [3]:
# 二維
np.zeros((2,5))# 建議用元組,官方文檔都是元組
Out[3]:
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
In [4]:
# 三維 ==> 可以這麼理解,2個2*5(2行5列)的矩陣
np.zeros((2,2,5))
Out[4]:
array([[[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])
In [5]:
################ 全1矩陣 ################
In [6]:
# `np.ones(tuple)` 用法和`np.zeros(tuple)`差不多
# 可以指定類型 np.ones(5,dtype=int)
# 一維
np.ones(5) # 完整寫法 np.ones((5,))
Out[6]:
array([1., 1., 1., 1., 1.])
In [7]:
# 二維,傳一個shape元組
np.ones((2,5))
Out[7]:
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
In [8]:
# 三維 可以理解為兩個二維數組
np.ones((2,2,5))
Out[8]:
array([[[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]],

       [[1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1.]]])
In [9]:
################ 指定值矩陣 ################
In [10]:
# 創建指定值的矩陣:
np.full((3,5),222)
Out[10]:
array([[222, 222, 222, 222, 222],
       [222, 222, 222, 222, 222],
       [222, 222, 222, 222, 222]])
In [11]:
# 創建指定值的矩陣,浮點類型
np.full((3,5),222.0)
Out[11]:
array([[222., 222., 222., 222., 222.],
       [222., 222., 222., 222., 222.],
       [222., 222., 222., 222., 222.]])
 

2.3.3.轉置矩陣

轉置矩陣 :將矩陣的行列互換得到的新矩陣(行列式不變)

m行×n列的矩陣行和列交換後就變成了n行×m列的矩陣,eg:3行×2列 ==> 2行×3列

$\begin{bmatrix}1&2 \\3&4 \\5&6\end{bmatrix}^T ==> \begin{bmatrix}1&3&5 \\2&4&6\end{bmatrix}$

矩陣的轉置滿足分配律:

$(A + B)^T = A^T + B^T$

$(AB)^T = B^TA^T$

再次提醒:兩個矩陣的乘法僅當第一個矩陣A的列數(column)和另一個矩陣B的行數(row)相等才可以進行計算

In [12]:
A = np.arange(6).reshape((2,3))

print(A)
 
[[0 1 2]
 [3 4 5]]
In [13]:
# 轉置矩陣(行列互換)
A.T
Out[13]:
array([[0, 3],
       [1, 4],
       [2, 5]])
In [14]:
B = np.random.randint(10,size=(2,3))

print(B)
 
[[4 4 7]
 [5 3 9]]
In [15]:
################ 驗證系列 ################
In [16]:
# 驗證一下(A+B)^T=A^T+B^T
print(A.T + B.T)
print("-"*5)
print((A+B).T)
 
[[ 4  8]
 [ 5  7]
 [ 9 14]]
-----
[[ 4  8]
 [ 5  7]
 [ 9 14]]
In [17]:
# 驗證一下(A+B)^T=A^T+B^T
# 其實也再一次驗證了,Numpy運算符預設是對每一個元素的操作
(A+B).T == A.T + B.T
Out[17]:
array([[ True,  True],
       [ True,  True],
       [ True,  True]])
In [18]:
################ 驗證系列 ################
In [19]:
# 把A變成3*2的矩陣,不夠元素用0補
# reshape:有返回值,不對原始多維數組進行修改
# resize:無返回值,會對原始多維數組進行修改
A.resize(3,2)

print(A)
print(B)
 
[[0 1]
 [2 3]
 [4 5]]
[[4 4 7]
 [5 3 9]]
In [20]:
# 驗證(AB)^T=B^T×A^T
print((A.dot(B)).T)
print("-"*5)
print((B.T).dot(A.T))
 
[[ 5 23 41]
 [ 3 17 31]
 [ 9 41 73]]
-----
[[ 5 23 41]
 [ 3 17 31]
 [ 9 41 73]]
 

2.3.3.上三角矩陣和下三角矩陣

上三角矩陣 :主對角線以下都是零的方陣

$\begin{bmatrix} 2&9&4&7 \\ 0&7&3&3 \\ 0&0&6&1 \\ 0&0&0&1 \end{bmatrix}$

下三角矩陣 :主對角線以上都是零的方陣

$\begin{bmatrix} 2&0&0&0 \\ 3&7&0&0 \\ 5&6&7&0 \\ 1&2&3&4 \end{bmatrix}$

性質(行列式後面會說)

  1. 上(下)三角矩陣的行列式為對角線元素相乘
  2. 上(下)三角矩陣乘以繫數後也是上(下)三角矩陣
  3. 上(下)三角矩陣間的加減法和乘法運算的結果仍是上(下)三角矩陣
  4. 上(下)三角矩陣的逆矩陣也仍然是上(下)三角矩陣
In [21]:
# 創建一個5行4列矩陣
A = np.random.randint(10,size=(4,4))

print(A)
 
[[3 5 2 3]
 [7 2 9 6]
 [5 1 7 6]
 [1 2 8 4]]
In [22]:
# 上三角
np.triu(A)
Out[22]:
array([[3, 5, 2, 3],
       [0, 2, 9, 6],
       [0, 0, 7, 6],
       [0, 0, 0, 4]])
In [23]:
# 下三角
np.tril(A)
Out[23]:
array([[3, 0, 0, 0],
       [7, 2, 0, 0],
       [5, 1, 7, 0],
       [1, 2, 8, 4]])
In [24]:
# 驗證一下最後一個性質
# 三角矩陣的逆矩陣也仍然是三角矩陣
print(np.triu(A).T)
print('-'*5)
print(np.tril(A).T)
 
[[3 0 0 0]
 [5 2 0 0]
 [2 9 7 0]
 [3 6 6 4]]
-----
[[3 7 5 1]
 [0 2 1 2]
 [0 0 7 8]
 [0 0 0 4]]
 

2.3.4.對角矩陣

對角矩陣 :主對角線之外的元素皆為0的方陣 (單位矩陣屬於對角矩陣中的一種)

$\begin{bmatrix}0&0&0 \\0&0&0 \\0&0&0\end{bmatrix} \begin{bmatrix}1&0&0 \\0&1&0 \\0&0&1\end{bmatrix} \begin{bmatrix}2&0&0 \\0&2&0 \\0&0&2\end{bmatrix} \begin{bmatrix}3&0&0 \\0&9&0 \\0&0&6\end{bmatrix}$

擴充:對角矩陣的運算包括和、差運算、數乘運算、同階對角陣的乘積運算,且結果仍為對角陣

而且有意思的是:對角矩陣的矩陣冪運算等於其對應元素的冪運算

$\begin{bmatrix}3&0&0 \\0&9&0 \\0&0&6\end{bmatrix}^n = \begin{bmatrix}3^n&0&0 \\0&9^n&0 \\0&0&6^n\end{bmatrix}$

In [25]:
# 簡單創建
np.diag([3,9,6])
Out[25]:
array([[3, 0, 0],
       [0, 9, 0],
       [0, 0, 6]])
In [26]:
np.diag([2,2,2])
Out[26]:
array([[2, 0, 0],
       [0, 2, 0],
       [0, 0, 2]])
In [27]:
################ 驗證系列 ################
In [28]:
# np.diag?
print(A)

# 獲取對角元素,然後再生成對角矩陣
B = np.diag(A.diagonal()) #或者 np.diag(np.diag(A))

print(B)
 
[[3 5 2 3]
 [7 2 9 6]
 [5 1 7 6]
 [1 2 8 4]]
[[3 0 0 0]
 [0 2 0 0]
 [0 0 7 0]
 [0 0 0 4]]
In [29]:
B.dot(B).dot(B)
Out[29]:
array([[ 27,   0,   0,   0],
       [  0,   8,   0,   0],
       [  0,   0, 343

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 字典: key值經過哈希函數的運算的結果決定value存放的地址,且key值是由不可變數組成。value可以是任何python的對象。 字典基本操作 增 查 刪 排 ...
  • 更新時間:2018 06 14 《Python指南》原文在 "這裡" 。本篇筆記主要是劃重點。 Python 3.6.3 1、簡單入門 1.1 編碼 預設情況下,Python 源文件是 UTF 8 編碼。 你也可以為源文件指定不同的字元編碼。 1.2 註釋 Python 中的註釋以 字元起始,直至實 ...
  • 生成器的特點是工作到一半,就會停下來看別人幹活直至有人踢它屁股,這時它才繼續往下幹活。實現這一功能的精髓要用到yield。 生成器是一種特殊的迭代器,因此我們先來瞭解一下什麼是迭代器。我們都知道著名的斐波那契數列:1、1、2、3、5、8、13、21、34……從第三個數開始,每個數都可以由其前面的兩個 ...
  • 今日內容: 1、子評論評論樓的實現;評論樹尚未實現; 2、富文本編輯器的使用。 XSS攻擊全稱跨站腳本攻擊,為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的電腦安全漏洞,它允許惡意web用戶將代碼植入 ...
  • 上一篇文章,學習了併發編程中的volatile,最後取了網上流傳很廣的一張圖來結尾,從圖中可以看出除了volatile變數的讀寫,還有一個叫做CAS的東西,所以這篇文章再來學習CAS。 1、 併發編程三要素-原子性、可見性、有序性 在討論CAS前,我想先討論一下併發編程的三要素,這個應該可以幫助理解 ...
  • 什麼是RESTful? RESTful是一種開發理念,REST是Roy Thomas Fileding在他博文提出的.REST特點;url簡潔,將參數通過url傳遞到伺服器,簡單就是說URL定位資源,用HTTP動詞描述操作. RESTful架構: 每一個URL代表一種資源; 客戶端和伺服器之間,傳遞 ...
  • JRE(Java Runtime Environment Java運行環境) 包括Java虛擬機(JVM Java Virtual Machine)和Java程式所需的核心類庫等,如果想要運行一個開發好的Java程式,電腦中只需要安裝JRE即可。 JDK(Java Development Kit ...
  • 上兩篇文章我向大家介紹了一些線程間的基本通信方式,那麼這篇文章就和大家聊聊volatile關鍵字的相關知識。這個關鍵字在我們的日常開發中很少會使用到,而在JDK的Lock包和Concurrent包下的類則大量的使用了這個關鍵字,因為它有如下兩個特性: 1.確保記憶體可見性 2.禁止指令重排序 接下來就 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...