2026a

# 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

复数支持:

# 详细信息

数组页

像 pagemtimes 这样的分页运算函数对排列成一个多维数组的二维矩阵进行运算。例如,对于三维数组,数组的第三个维度中的元素通常称为页面,因为它们像书籍中的页一样堆叠在一起。每个页面都是由函数对其进行运算的一个矩阵。

您也可以将二维矩阵的集合组成一个更高维度的数组,如四维或五维数组,在这种情况下, pagemtimes 仍将数组的基本单位视为可对其进行运算的一个二维矩阵,如 X[:,:,i,j,k,l]。

cat 函数可用于将矩阵集合组合成一个多维数组,而 zeros 函数可用于预分配一个多维数组。

# 提示

对于实数 N 维数组, pagemtimes(X,"transpose",X,"none") 返回具有对称页的矩阵。同样,对于复数 N 维数组,可以使用 pagemtimes(X,"ctranspose",X,"none") 获得对称页。

# 另请参阅

* | .* | pagectranspose | pagetranspose