# 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 获得的结果在数值上等同于使用 for 循环逐页调用左矩阵除法得到的结果。但由于浮点舍入误差的存在,两种方式得到的结果可能会有细微差异。
# 另请参阅
pagemrdivide | pagemtimes | pagectranspose | pagetranspose | rcond