# pagemtimes
按页矩阵乘法
函数库: TyMath
# 语法
Z = pagemtimes(X, Y)
Z = pagemtimes(X, transpX, Y, transpY)
# 说明
Z = pagemtimes(X, Y) 计算 N 维数组 X 和 Y 的对应的页的矩阵乘积。输出数组 Z 的每页都由乘积给出:Z[:,:,i] = X[:,:,i]*Y[:,:,i]。示例
如果 X 和 Y 之一是矩阵,则 pagemtimes 将其与另一输入的每页相乘。例如,如果 X 是矩阵,则 Z[:,:,i] = X*Y[:,:,i];
如果 X 和 Y 有三个以上的维度,则前两个维度以外的所有维度必须具有兼容大小。pagemtimes 隐式扩展额外的维度,以乘以分页矩阵的所有组合:Z[:,:,i,j,k] = Xx[:,:,i,j,k]*Yy[:,:,i,j,k]。(额外维度已在 Xx 和 Yy 中扩展。)
Z = pagemtimes(X, transpX, Y, transpY) 可以选择使用 X 和 Y 的指定转置来计算矩阵乘积。对于此语法,您必须指定两个转置选项。 transpX 和 transpY 必须分别为: "transpose"、 "ctranspose" 或 "none"。 示例
# 示例
乘以三维数组
using TyMath
rng = MT19937ar(5489)
X = randi(rng, (1, 6), 2, 2, 3)
X = 2×2×3 Array{Int64, 3}:
[:, :, 1] =
5 1
6 6
[:, :, 2] =
4 2
1 4
[:, :, 3] =
6 1
6 6
Y = randi(rng, (1, 6), 2, 2, 3)
Y = 2×2×3 Array{Int64, 3}:
[:, :, 1] =
6 5
3 1
[:, :, 2] =
3 5
6 6
[:, :, 3] =
4 6
1 6
Z = pagemtimes(X, Y)
Z = 2×2×3 Array{Int64, 3}:
[:, :, 1] =
33 26
54 36
[:, :, 2] =
24 32
27 29
[:, :, 3] =
25 42
30 72
输出 Z[:,,,i] 的第 i 页通过 X[:,:,i]*Y[:,:,i] 而形成。
乘以矩阵和三维数组
using TyMath
A = magic(3)
A = 3×3 Matrix{Int64}:
8 1 6
3 5 7
4 9 2
rng = MT19937ar(5489)
Y = randi(rng, (1, 10), 3, 3, 3)
Y = 3×3×3 Array{Int64, 3}:
[:, :, 1] =
9 10 3
10 7 6
2 1 10
[:, :, 2] =
10 10 2
2 5 5
10 9 10
[:, :, 3] =
8 1 7
10 9 8
7 10 8
Z = pagemtimes(A, Y)
Z = 3×3×3 Array{Int64, 3}:
[:, :, 1] =
94 93 90
91 72 109
130 105 86
[:, :, 2] =
142 139 81
110 118 101
78 103 73
[:, :, 3] =
116 77 112
123 118 117
136 105 116
输出 Z[:,:,i] 的第 i 页通过乘以 A*Y[:,:,i] 而形成。
乘以转置后的数组页
创建两个三维数组 X 和 Y。使用 pagemtimes 对 X 和 Y 的每页执行运算 X[:,:,i]'*Y[:,:,i]。
using TyMath
rng = MT19937ar(5489)
X = rand(rng, 3, 3, 3) .+ 1im
Y = rand(rng, 3, 3, 3)
A = pagemtimes(X, "ctranspose", Y, "none")
A = 3×3×3 Array{ComplexF64, 3}:
[:, :, 1] =
0.935022-1.21889im 0.639232-1.0148im 0.230166-0.966761im
0.789446-1.21889im 0.692026-1.0148im 0.183914-0.966761im
0.631616-1.21889im 0.479197-1.0148im 0.854445-0.966761im
[:, :, 2] =
1.64269-1.96215im 0.472726-0.854749im 1.04535-1.74759im
1.57942-1.96215im 0.55128-0.854749im 1.26825-1.74759im
1.10248-1.96215im 0.539339-0.854749im 0.615127-1.74759im
[:, :, 3] =
1.23935-1.58166im 1.46708-1.74008im 1.27366-1.49741im
0.999503-1.58166im 0.923965-1.74008im 0.732414-1.49741im
1.15036-1.58166im 1.25845-1.74008im 1.07857-1.49741im
现在,对 X 和 Y 的每页执行运算 X[:,:,i]*Y[:,:,j]'。
B = pagemtimes(X, "none", Y, "transpose")
B = 3×3×3 Array{ComplexF64, 3}:
[:, :, 1] =
0.977301+1.14444im 0.59016+0.784443im 0.621736+1.27157im
0.827001+1.14444im 0.666976+0.784443im 0.780508+1.27157im
0.162885+1.14444im 0.179346+0.784443im 0.837216+1.27157im
[:, :, 2] =
0.812019+1.49479im 0.838745+1.55104im 1.30859+1.51865im
0.449099+1.49479im 0.598319+1.55104im 0.413782+1.51865im
1.40297+1.49479im 1.38709+1.55104im 1.39876+1.51865im
[:, :, 3] =
0.874666+1.87883im 0.824586+1.85537im 0.632242+1.08495im
1.58731+1.87883im 1.56476+1.85537im 0.977731+1.08495im
1.48881+1.87883im 1.48389+1.85537im 0.802461+1.08495im
将 N 维数组相乘
创建一个 3x3x2 数组 X ,并将其与 3x3x1x4 数组 Y 相乘。结果大小为 3x3x2x4。
using TyMath
using TyBase
X = ones(Int,3,3,2)
A = eye(3)
Y = cat(A, 2*A, 3*A, 4*A, dims=4)
Z = pagemtimes(X, Y)
Z = 3×3×2×4 Array{Int64, 4}:
[:, :, 1, 1] =
1 1 1
1 1 1
1 1 1
[:, :, 2, 1] =
1 1 1
1 1 1
1 1 1
[:, :, 1, 2] =
2 2 2
2 2 2
2 2 2
[:, :, 2, 2] =
2 2 2
2 2 2
2 2 2
[:, :, 1, 3] =
3 3 3
3 3 3
3 3 3
[:, :, 2, 3] =
3 3 3
3 3 3
3 3 3
[:, :, 1, 4] =
4 4 4
4 4 4
4 4 4
[:, :, 2, 4] =
4 4 4
4 4 4
4 4 4
大小为 1 的每个维度(在前两个维度后)会隐式扩展以匹配另一个输入的维度大小,然后通过乘以 X[:,:,i,j]*Y[:,:,i,j] 而形成输出 Z[:,:,i,j] 的每页。此运算的一种直观考虑方式是, X 在三维数组中包含两个矩阵作为页, Y 包含四个沿着第四个维度排列的矩阵;因此,将这些矩阵的所有组合相乘得到八个 3x3 矩阵。
# 输入参数
X, Y - 输入数组向量 | 矩阵 | 多维数组
输入数组,指定为向量、稠密矩阵或多维数组。 X 和 Y 的页必须为矩阵乘积 * 的有效输入。
如果 X 或 Y 之一是矩阵或向量,则 pagemtimes 将其与另一输入的每页相乘。例如,如果 X 是矩阵,则 Z[:,:,i] = X*Y[:,:,i];
如果 X 和 Y 有三个以上的维度,则前两个维度以外的所有维度必须具有兼容大小。pagemtimes 隐式扩展额外的维度,以乘以分页矩阵的所有组合:Z[:,:,i,j,k] = Xx[:,:,i,j,k]*Yy[:,:,i,j,k]。(额外维度已在 Xx 和 Yy 中扩展。)
数据类型: Int | Float | Bool
复数支持: 是
transpX, transpY - 转置选项"none"(默认) | "transpose" | "ctranspose"
转置选项,每个选项都指定为下表中的值之一。
| 值 | 说明 |
|---|---|
| "none" | 不要应用转置。 |
| "transpose" | 将转置应用于对应输入的每页。 |
| "ctranspose" | 将复共轭转置应用于对应输入的每页。 |
使用转置选项一按页方式计算运算,如 X'*Y 。即使只对一个输入进行转置,您也必须指定两个转置选项。
示例: pagemtimes(X, "ctranspose", Y, "none") 计算 X'*Y 的按页版本。
数据类型: String
# 输出参数
Z - 输出数组多维数组
输出数组,以多维数组形式返回。 pagemtimes 执行的运算取决于输入 X 和 Y 的大小:
| X 的大小 | Y 的大小 | 运算 |
|---|---|---|
| 三维 | 三维 | Z[:,:,i] = X[:,:,i]*Y[:,:,i] |
| 二维 | 三维 | Z[:,:,i] = X*Y[:,:,i] |
| 三维 | 二维 | Z[:,:,i] = X[:,:,i]*Y |
| N 维 | N 维 | Z[:,:,i,j,k] = X[:,:,i,j,k]*Y[:,:,i,j,k] |
Z 的大小遵循以下规则:
在前两个维度中,适用矩阵乘法规则。如果任意操作数是标量,则结果具有非标量操作数的大小。当两个操作数均为矩阵时,将 mxn 矩阵乘以 nxq 矩阵会得到 mxq 矩阵;
X 和 Y 中前两个维度之外的兼容维度会扩展以匹配非单一维度。因此,如果 X 为 10x8x1x3,Y 为 8x10x4x1,则 Z 为 10x10x4x3。
数据类型: Int | Float
复数支持: 是
# 详细信息
数组页
# 提示
对于实数 N 维数组, pagemtimes(X,"transpose",X,"none") 返回具有对称页的矩阵。同样,对于复数 N 维数组,可以使用 pagemtimes(X,"ctranspose",X,"none") 获得对称页。
# 另请参阅
* | .* | pagectranspose | pagetranspose