torch.mv
时间: 2025-07-20 15:20:29 浏览: 2
<think>我们被要求介绍torch.mv函数。根据PyTorch文档,torch.mv是矩阵和向量相乘的函数。
函数签名:torch.mv(input, vec, *, out=None) → Tensor
作用:对矩阵input和向量vec进行矩阵乘法。如果input是一个(n×m)张量,vec是一个大小为m的一维张量,则输出是一个大小为n的一维张量。
注意:torch.mv不支持广播(broadcasting),如果需要广播,应使用torch.matmul。
我们来看一个示例:</think>### PyTorch `torch.mv` 函数详解
`torch.mv` 是 PyTorch 中用于执行**矩阵-向量乘法**的核心函数,专为高效计算矩阵与一维向量的乘积而设计。它是线性代数运算的基础组件,广泛应用于神经网络层计算、线性变换等场景。
#### 🔍 函数签名与数学原理
```python
torch.mv(input, vec, *, out=None) → Tensor
```
**数学定义**:
设矩阵 $A \in \mathbb{R}^{m \times n}$,向量 $\vec{v} \in \mathbb{R}^{n}$,则乘积为:
$$ A \cdot \vec{v} = \begin{bmatrix}
a_{11} & \cdots & a_{1n} \\
\vdots & \ddots & \vdots \\
a_{m1} & \cdots & a_{mn}
\end{bmatrix} \begin{bmatrix} v_1 \\ \vdots \\ v_n \end{bmatrix} = \begin{bmatrix} \sum_{j=1}^n a_{1j}v_j \\ \vdots \\ \sum_{j=1}^n a_{mj}v_j \end{bmatrix} $$
**核心特性**:
1. **输入要求**:
- `input`:必须是**二维张量**(矩阵)
- `vec`:必须是**一维张量**(向量)
2. **维度匹配**:矩阵的列数必须等于向量的长度($n$)
3. **输出**:结果为一维向量(长度等于矩阵行数 $m$)
---
### 💻 基础用法示例
#### 示例1:基本矩阵-向量乘法
```python
import torch
# 定义矩阵 (2x3) 和向量 (长度3)
matrix = torch.tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.float32)
vector = torch.tensor([0.5, 1.0, 1.5])
# 执行乘法
result = torch.mv(matrix, vector)
print(result) # 输出: tensor([ 7., 16.])
```
**计算过程**:
$ \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} \begin{bmatrix} 0.5 \\ 1.0 \\ 1.5 \end{bmatrix} = \begin{bmatrix} 1×0.5 + 2×1.0 + 3×1.5 \\ 4×0.5 + 5×1.0 + 6×1.5 \end{bmatrix} = \begin{bmatrix} 7 \\ 16 \end{bmatrix} $
#### 示例2:自动类型提升
```python
# 整型矩阵与浮点向量
int_matrix = torch.tensor([[2, 3], [4, 5]])
float_vector = torch.tensor([1.5, 2.5])
result = torch.mv(int_matrix, float_vector)
print(result) # tensor([10.5000, 18.5000]) 自动转为浮点型
```
---
### 🧩 实际应用场景
#### 1. 全连接层前向传播
```python
# 模拟线性层: y = Wx + b
batch_size = 3
input_dim = 4
output_dim = 2
# 权重矩阵 (2x4) 和偏置 (2,)
W = torch.randn(output_dim, input_dim)
b = torch.randn(output_dim)
x = torch.randn(batch_size, input_dim) # 输入向量批处理
# 对每个样本执行矩阵-向量乘法
outputs = []
for i in range(batch_size):
y = torch.mv(W, x[i]) + b # W·x_i + b
outputs.append(y)
print(torch.stack(outputs).shape) # torch.Size([3, 2])
```
#### 2. 物理系统模拟(力-位移关系)
```python
# 计算弹簧系统力向量: F = K·Δx
stiffness_matrix = torch.tensor([[2.0, -1.0],
[-1.0, 2.0]]) # 刚度矩阵 (2x2)
displacement = torch.tensor([0.3, 0.2]) # 位移向量
force = torch.mv(stiffness_matrix, displacement)
print(f"节点力: {force} N") # tensor([0.4, 0.1]) N
```
#### 3. 与 `torch.where` 结合的条件计算[^1]
```python
# 仅对正向量元素执行乘法
mask = vector > 0
filtered_vector = torch.where(mask, vector, torch.zeros_like(vector))[^1]
filtered_result = torch.mv(matrix, filtered_vector)
print(filtered_result) # 仅保留正分量的计算结果
```
---
### ⚠️ 常见错误与解决方案
1. **维度不匹配错误**:
```python
# 错误:矩阵列数(3) ≠ 向量长度(2)
matrix = torch.rand(2, 3)
vector = torch.rand(2)
try:
torch.mv(matrix, vector)
except RuntimeError as e:
print(e) # "size mismatch, m1: [2x3], v: [2]"
```
**解决方案**:调整维度匹配
```python
vector = torch.rand(3) # 修正为长度3
```
2. **输入维度错误**:
```python
# 错误:input应为矩阵,vec应为向量
3d_tensor = torch.rand(2, 3, 4)
try:
torch.mv(3d_tensor, vector)
except RuntimeError as e:
print(e) # "2D tensor expected"
```
**解决方案**:使用 `torch.matmul` 处理高维输入
```python
result = torch.matmul(3d_tensor, vector.unsqueeze(-1)).squeeze(-1)[^5]
```
---
### 🔄 相关函数对比
| 函数 | 输入维度 | 输出维度 | 适用场景 |
|------|----------|----------|----------|
| `torch.mv(matrix, vec)` | 2D + 1D | 1D | 专用矩阵-向量乘法 |
| `matrix @ vec` | 2D + 1D | 1D | 运算符形式(推荐) |
| `torch.matmul(matrix, vec)` | 任意维度 | 降维输出 | 通用矩阵乘法 |
| `torch.einsum('ij,j->i', matrix, vec)` | 任意维度 | 1D | 爱因斯坦求和约定 |
| `torch.bmm(batch_matrix, vec.unsqueeze(-1))` | 3D + 3D | 3D | 批量矩阵-向量乘法 |
#### 使用 `torch.einsum` 实现等价操作
```python
einsum_result = torch.einsum('ij,j->i', matrix, vector)
print(torch.allclose(result, einsum_result)) # True
```
#### 批量计算技巧
```python
# 批量矩阵 (3个2x3矩阵) 和 批量向量 (3个长度3向量)
batch_matrix = torch.stack([matrix]*3) # shape [3,2,3]
batch_vector = torch.stack([vector]*3) # shape [3,3]
# 方法1: 循环调用torch.mv
results = [torch.mv(batch_matrix[i], batch_vector[i]) for i in range(3)]
# 方法2: 使用torch.matmul自动广播
batch_result = torch.matmul(batch_matrix, batch_vector.unsqueeze(-1)).squeeze(-1)
```
---
### 💡 性能优化建议
1. **GPU加速**:大规模计算时使用CUDA张量
```python
device = torch.device('cuda')
large_matrix = torch.rand(10000, 10000, device=device)
large_vector = torch.rand(10000, device=device)
torch.mv(large_matrix, large_vector) # 自动GPU并行
```
2. **内存布局优化**:优先使用行连续矩阵
```python
# 转置使内存连续(针对列主序数据)
contig_matrix = matrix.t().contiguous().t()
```
3. **替代方案**:对于超大矩阵,使用`torch.sparse.mv`支持稀疏矩阵
```python
sparse_matrix = matrix.to_sparse()
torch.sparse.mm(sparse_matrix, vector.unsqueeze(-1)).squeeze()
```
---
阅读全文
相关推荐


















