2026a

# pagemldivide


按页左矩阵除法

函数库: TyMath

# 语法

X = pagemldivide(A, B)
X = pagemldivide(A, transpA, B)
X, rcondA = pagemldivide(___; nargout = Val(2))

# 说明

X = pagemldivide(A, B) 计算 N 维数组 A 的每页与 N 维数组 B 的对应页之间的左矩阵除法。输出数组 X 的每页都由对应的线性方程组给出:,即 示例

如果 A 和 B 有三个以上的维度,则前两个维度以外的所有维度都必须具有兼容大小。pagemldivide 会隐式扩展这些额外维度,以计算分页矩阵的所有组合:


X = pagemldivide(A, transpA, B) 可以在求解前对 A 的每页应用指定的转置。transpA 必须为 "transpose"、"ctranspose" 或 "none"。例如,pagemldivide(A, "transpose", B) 对每页计算 示例


X, rcondA = pagemldivide(___; nargout = Val(2)) 还返回 A 每页条件数倒数的估计值。对于病态页,可以通过 rcondA 判断解的可靠性;与直接对每页使用左矩阵除法不同,pagemldivide 不会对病态输入自动发出警告。示例

# 示例

求解按页线性方程组

创建两个三维数组 A 和 B,并对每页求解线性方程组

using TyMath
p1 = magic(3)
p2 = hilb(3)
A = cat(p1, p2, dims=3)
B = ones(3, 1, 2)
X = pagemldivide(A, B)
3×1×2 Array{Float64, 3}:
[:, :, 1] =
 0.06666666666666665
 0.06666666666666667
 0.06666666666666668

[:, :, 2] =
   3.000000000000021
 -24.0000000000001
  30.00000000000009

输出 X 的第 i 页等价于逐页求解 后再堆叠而成。

求解转置后的分页方程组

创建两个三维数组 A 和 B,并指定 "transpose" 选项,对每页求解

using TyMath
p1 = pascal(4)
p2 = magic(4)
A = cat(p1, p2, dims=3)
B = 2 * ones(4, 1, 2)
X = pagemldivide(A, "transpose", B)
4×1×2 Array{Float64, 3}:
[:, :, 1] =
  2.0
  0.0
 -0.0
  0.0

[:, :, 2] =
 -0.09010957324106111
 -0.3879757785467128
  0.5056228373702422
  0.20775663206459055

提示

本案例中 p2 为奇异矩阵,因此不同电脑可能结果有差异。

如果 A 为复数数组,则可以将 "transpose" 替换为 "ctranspose",以对每页使用复共轭转置。

检查数组页的条件数倒数

请求第二个输出参数 rcondA,以检查 A 的每页是否病态。

using TyMath
p1 = diagm([ones(9); 0])
p2 = pascal(10)
A = cat(p1, p2, dims=3)
B = 3 * ones(10, 1, 2)
X, rcondA = pagemldivide(A, B; nargout = Val(2))
rcondA .< eps()
rcondA = 1×1×2 Array{Float64, 3}:
[:, :, 1] =
 0.0

[:, :, 2] =
 1.2294530487759764e-10
ans = 1×1×2 BitArray{3}:
[:, :, 1] =
 1

[:, :, 2] =
 0

结果表明第一页对应的矩阵是病态的,因此该页得到的解可能不可靠。pagemldivide 本身不会针对这类页发出警告,但可以通过 rcondA 提前识别。

# 输入参数

A, B - 输入数组
多维数组

输入数组,指定为多维数组。A 和 B 的对应页必须是左矩阵除法的有效输入。

如果 A 和 B 有三个以上的维度,则前两个维度以外的所有维度都必须具有兼容大小。pagemldivide 会隐式扩展这些额外维度,以计算所有对应页的组合。

数据类型: Integer | AbstractFloat

复数支持:

transpA - A 的转置选项
"none"(默认) | "transpose" | "ctranspose"

A 的转置选项,指定为下表中的值之一。

说明
"none" 不要对 A 的页应用转置。
"transpose" 对 A 的每页应用非共轭转置。
"ctranspose" 对 A 的每页应用复共轭转置。

示例: pagemldivide(A, "transpose", B)

数据类型: String

nargout - 控制输出参数
Val(1)(默认) | Val(2)

nargout 是用于控制输出个数的关键字参数。默认值为 Val(1)。指定 nargout = Val(2) 时,函数除返回分页线性方程组的解 X 外,还返回 A 各页条件数倒数的估计值 rcondA。

示例: X, rcondA = pagemldivide(A, B; nargout = Val(2))

数据类型: Val

# 输出参数

X - 线性方程组解
多维数组

线性方程组解,以多维数组形式返回,其页数与 A 和 B 对应。X 的每页都是对应分页方程组 的解。

数据类型: AbstractFloat

复数支持:

rcondA - A 的条件数倒数估计值
多维数组

A 的条件数倒数估计值,以多维数组形式返回。若 A 的页是非方矩阵,则 rcondA 使用对应 QR 分解中 R 的元素进行估计。

  • 如果 ,则第 i 页对应的线性系统通常被认为是病态的,所得解可能不可靠;
  • rcondA 的结果可能与 rcond 对单页单独计算得到的值不完全相同。

数据类型: AbstractFloat

# 详细信息

数组页

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

您也可以将二维矩阵的集合组成一个更高维度的数组,如四维或五维数组,在这种情况下,pagemldivide 仍将数组的基本单位视为一个可参与求解的二维矩阵,例如

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

# 提示

使用 pagemldivide 获得的结果在数值上等同于使用 for 循环逐页调用左矩阵除法得到的结果。但由于浮点舍入误差的存在,两种方式得到的结果可能会有细微差异。

# 另请参阅

pagemrdivide | pagemtimes | pagectranspose | pagetranspose | rcond