torch.sparse.spdiags¶
- torch.sparse.spdiags(diagonals, offsets, shape, layout=None) Tensor ¶
通过将
diagonals
的行值放置在输出指定的对角线上来创建一个稀疏的 2D 张量第 0#个张量控制哪些对角线被设置。
如果
offsets[i]
等于 0,则是主对角线如果
offsets[i]
小于 0,则位于主对角线下方如果
offsets[i]
大于 0,则位于主对角线上方
diagonals
的行数必须与offsets
的长度匹配,且偏移量不得重复。- 参数:
对角线(张量)- 按行存储对角线的矩阵
偏移量(张量)- 要设置的对角线,存储为向量
形状(两个整数的元组)- 所需的结果形状
- 关键字参数:
布局(
torch.layout
,可选)- 返回张量的期望布局。torch.sparse_coo
,torch.sparse_csc
和torch.sparse_csr
受支持。默认:torch.sparse_coo
示例:
设置矩阵的主对角线以及前两个下对角线:
>>> diags = torch.arange(9).reshape(3, 3) >>> diags tensor([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3)) >>> s tensor(indices=tensor([[0, 1, 2, 1, 2, 2], [0, 1, 2, 0, 1, 0]]), values=tensor([0, 1, 2, 3, 4, 6]), size=(3, 3), nnz=6, layout=torch.sparse_coo) >>> s.to_dense() tensor([[0, 0, 0], [3, 1, 0], [6, 4, 2]])
更改输出布局:
>>> diags = torch.arange(9).reshape(3, 3) >>> diags tensor([[0, 1, 2],[3, 4, 5], [6, 7, 8]) >>> s = torch.sparse.spdiags(diags, torch.tensor([0, -1, -2]), (3, 3), layout=torch.sparse_csr) >>> s tensor(crow_indices=tensor([0, 1, 3, 6]), col_indices=tensor([0, 0, 1, 0, 1, 2]), values=tensor([0, 3, 1, 6, 4, 2]), size=(3, 3), nnz=6, layout=torch.sparse_csr) >>> s.to_dense() tensor([[0, 0, 0], [3, 1, 0], [6, 4, 2]])
设置大输出矩阵的部分对角线:
>>> diags = torch.tensor([[1, 2], [3, 4]]) >>> offsets = torch.tensor([0, -1]) >>> torch.sparse.spdiags(diags, offsets, (5, 5)).to_dense() tensor([[1, 0, 0, 0, 0], [3, 2, 0, 0, 0], [0, 4, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])
注意
当沿给定对角线设置值时,将使用对角线索引和
diagonals
行索引作为输出中的列索引。这导致当设置具有正偏移量 k 的对角线时,该对角线上的第一个值将是diagonals
行的第 k 个位置的值。指定正偏移量:
>>> diags = torch.tensor([[1, 2, 3], [1, 2, 3], [1, 2, 3]]) >>> torch.sparse.spdiags(diags, torch.tensor([0, 1, 2]), (5, 5)).to_dense() tensor([[1, 2, 3, 0, 0], [0, 2, 3, 0, 0], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])