# 8.4 线性代数

### 8.4.1 SciPy与线性代数

当使用优化的ATLAS LAPACK和BLAS库构建SciPy时，它具有非常快的线性代数能力。如果你挖得足够深，所有的原始lapack和blas库都可以为你提供更快的速度。在本节中，将描述这些例程的一些易于使用的接口。所有这些线性代数例程都期望一个对象可以转换成二维数组。这些例程的输出也是一个二维数组。

### 8.4.2 矩阵运算

我们首先来创建个的np矩阵A和一个的行向量b

A=array(\[\[1, 2],

\[3, 4]])

b= array(\[\[5, 6]])

#### 矩阵求逆

\>>> linalg.inv(A)

array(\[\[-2. , 1. ],

\[ 1.5, -0.5]])

#### 矩阵转置

b.T

array(\[\[5],

\[6]])

#### 矩阵乘法

\>>> A\*b #not matrix multiplication!

array(\[\[ 5, 12],

\[15, 24]])

#### 数乘矩阵

\>>> A.dot(b.T) #matrix multiplication

array(\[\[17],

\[39]])

### 8.6.3 计算行列式

在scipy中，行列式可以用linalg.det计算。

linalg.det(A)

-2.0

### 8.6.4 计算范数

矩阵和向量范数也可以用scipy计算。对于linalg.norm的order参数，使用不同的参数可以获得广泛的norm定义。此函数接受一个秩1（向量）或秩2（矩阵）数组和一个可选的顺序参数（默认值为2）。根据这些输入，计算出所请求顺序的向量或矩阵范数。

\>>> import numpy as np

\>>> from scipy import linalg

\>>> A=np.array(\[\[1,2],\[3,4]])

\>>> A

array(\[\[1, 2],

\[3, 4]])

norm()函数默认求frobenius范数。

\>>> linalg.norm(A)

5.4772255750516612

可以通过在norm()函数中加入第二个参数来求其他范数。

例如：求矩阵A的L1范数

\>>> linalg.norm(A,1) # L1 norm (max column sum)

求矩阵Ade 无穷范数

\>>> linalg.norm(A,np.inf) # L inf norm (max row sum)

7

### 8.6.7 矩阵函数

考虑函数f(x)用泰勒级数展开

对于方阵A，可以用泰勒级数定义矩阵函数为:

虽然这是矩阵函数的一种有用表示，但它很少是计算矩阵函数的最佳方法。

### 8.6.8 特殊矩阵

SciPy和NumPy为创建工程和科学中经常使用的特殊矩阵提供了几个函数。

| 类型              | 方程                                                                                                                                         | 描述               |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- |
| block diagonal  | [scipy.linalg.block\_diag](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.block_diag.html#scipy.linalg.block_diag) | 从提供的数组中创建一个块对角矩阵 |
| circulant       | [scipy.linalg.circulant](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.circulant.html#scipy.linalg.circulant)     | 构造一个循环矩阵         |
| companion       | [scipy.linalg.companion](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.companion.html#scipy.linalg.companion)     | 创建一个伙伴矩阵。        |
| Hadamard        | [scipy.linalg.hadamard](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.hadamard.html#scipy.linalg.hadamard)        | 构造一个哈达玛矩阵。       |
| Hankel          | [scipy.linalg.hankel](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.hankel.html#scipy.linalg.hankel)              | 构造汉克尔矩阵。         |
| Hilbert         | [scipy.linalg.hilbert](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.hilbert.html#scipy.linalg.hilbert)           | 构造一个希尔伯特矩阵。      |
| Inverse Hilbert | [scipy.linalg.invhilbert](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.invhilbert.html#scipy.linalg.invhilbert)  | 构造希尔伯特矩阵的逆。      |
| Leslie          | [scipy.linalg.leslie](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.leslie.html#scipy.linalg.leslie)              | 创建一个莱斯利矩阵。       |
| Pascal          | [scipy.linalg.pascal](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.pascal.html#scipy.linalg.pascal)              | 创建一个帕斯卡矩阵。       |
| Toeplitz        | [scipy.linalg.toeplitz](file:///C:/Users/Johan/Desktop/scipy-html-1.3.0/generated/scipy.linalg.toeplitz.html#scipy.linalg.toeplitz)        | 构造一个托普利兹矩阵。      |
| Van der Monde   | [numpy.vander](https://docs.scipy.org/doc/numpy/reference/generated/numpy.vander.html#numpy.vander)                                        | 生成一个范德蒙德矩阵。      |

有关这些函数的使用示例，请参见它们各自的文档字符串。
