# pagemrdivide
按页右矩阵除法
函数库: TyMath
# 语法
X = pagemrdivide(B, A)
X = pagemrdivide(B, A, transpA)
X, rcondA = pagemrdivide(___; nargout = Val(2))
# 说明
X = pagemrdivide(B, A) 计算 N 维数组 B 的每页与 N 维数组 A 的对应页之间的右矩阵除法。输出数组 X 的每页满足对应的线性方程组:
如果 B 和 A 有三个以上的维度,则前两个维度以外的所有维度都必须具有兼容大小。pagemrdivide 会隐式扩展这些额外维度,以计算分页矩阵的所有组合:
X = pagemrdivide(B, A, transpA) 可以在求解前对 A 的每页应用指定的转置。transpA 必须为 "transpose"、"ctranspose" 或 "none"。例如,pagemrdivide(B, A, "transpose") 对每页计算
X, rcondA = pagemrdivide(___; nargout = Val(2)) 还返回 A 每页条件数倒数的估计值。对于病态页,可以使用 rcondA 判断结果是否可靠;与直接对每页使用右矩阵除法不同,pagemrdivide 不会对病态输入自动发出警告。示例
# 示例
求解按页右除方程组
创建两个三维数组 A 和 B,并对每页求解线性方程组
using TyMath
p1 = magic(3)
p2 = hilb(3)
A = cat(p1, p2, dims=3)
B = ones(1, 3, 2)
X = pagemrdivide(B, A)
1×3×2 Array{Float64, 3}:
[:, :, 1] =
0.0666667 0.0666667 0.0666667
[:, :, 2] =
3.0 -24.0 30.0
输出 X 的第 i 页等价于逐页计算
求解转置后的分页右除方程组
创建两个三维数组 A 和 B,并指定 "transpose" 选项,对每页求解
using TyMath
p1 = pascal(4)
p2 = magic(4)
A = cat(p1, p2, dims=3)
B = 2 * ones(1, 4, 2)
X = pagemrdivide(B, A, "transpose")
1×4×2 Array{Float64, 3}:
[:, :, 1] =
2.0 9.19131e-15 -6.53486e-15 1.64653e-15
[:, :, 2] =
0.0784314 0.117647 0.0 0.0392157
如果 A 为复数数组,则可以改用 "ctranspose",以在求解前对每页应用复共轭转置。
检查数组页的条件数倒数
请求第二个输出参数 rcondA,以检查 A 的每页是否病态。
using TyMath
p1 = diagm([ones(9); 0])
p2 = pascal(10)
A = cat(p1, p2, dims=3)
B = 3 * ones(1, 10, 2)
X, rcondA = pagemrdivide(B, A; 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
结果表明第一页对应的矩阵是病态的,因此该页得到的解可能不可靠。pagemrdivide 本身不会针对这类页发出警告,但可以借助 rcondA 做数值稳定性检查。
# 输入参数
B, A - 输入数组多维数组
输入数组,指定为多维数组。B 和 A 的对应页必须是右矩阵除法的有效输入。
如果 B 和 A 有三个以上的维度,则前两个维度以外的所有维度都必须具有兼容大小。pagemrdivide 会隐式扩展这些额外维度,以计算所有对应页的组合。
数据类型: Integer | AbstractFloat
复数支持: 是
transpA - A 的转置选项"none"(默认) | "transpose" | "ctranspose"
A 的转置选项,指定为下表中的值之一。
| 值 | 说明 |
|---|---|
| "none" | 不要对 A 的页应用转置。 |
| "transpose" | 对 A 的每页应用非共轭转置。 |
| "ctranspose" | 对 A 的每页应用复共轭转置。 |
示例: pagemrdivide(B, A, "transpose")
数据类型: String
nargout - 控制输出参数Val(1)(默认) | Val(2)
nargout 是用于控制输出个数的关键字参数。默认值为 Val(1)。指定 nargout = Val(2) 时,函数除返回分页线性方程组的解 X 外,还返回 A 各页条件数倒数的估计值 rcondA。
示例: X, rcondA = pagemrdivide(B, A; nargout = Val(2))
数据类型: Val
# 输出参数
X - 线性方程组解多维数组
线性方程组解,以多维数组形式返回,其页数与 B 和 A 对应。X 的每页都是对应分页方程组
数据类型: AbstractFloat
复数支持: 是
rcondA - A 的条件数倒数估计值多维数组
A 的条件数倒数估计值,以多维数组形式返回。若 A 的页是非方矩阵,则 rcondA 使用对应 QR 分解中 R 的元素进行估计。
- 如果
,则第 i 页对应的线性系统通常被认为是病态的,所得解可能不可靠; - rcondA 的结果可能与 rcond 对单页单独计算得到的值不完全相同。
数据类型: AbstractFloat
# 详细信息
数组页
# 提示
使用 pagemrdivide 获得的结果在数值上等同于使用 for 循环逐页调用右矩阵除法得到的结果。但由于浮点舍入误差的存在,两种方式得到的结果可能会有细微差异。
# 另请参阅
pagemldivide | pagemtimes | pagectranspose | pagetranspose | rcond