4.1 行列式的定义

文章介绍了排列的逆序数概念,通过示例解释了如何计算排列的逆序数,并指出其与排列的奇偶性关系。接着,文章阐述了行列式的定义,特别是与逆序数的关系在计算行列式中的应用,并提供了Python代码实现。最后,提到了递归至2x2矩阵的Chiò算法作为更简单的行列式计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

排列的逆序数

  对于一个排列,如果是从到到尾都是从小到大,那么逆序数(number of permutation inversions)就为0.只要出现一次大的在前,小的在后,逆序数就加一次。逆序数的符号是希腊字母 τ \tau τ,读音为“涛",比如以下排列:
3 , 6 , 5 , 4 , 1 , 2 3,6,5,4,1,2 3,6,5,4,1,2
  它的逆序数是多少呢?把逆序对,写出来:
( 3 , 1 ) , ( 3 , 2 ) ( 6 , 5 ) , ( 6 , 4 ) , ( 6 , 1 ) , ( 6 , 2 ) ( 5 , 4 ) , ( 5 , 1 ) , ( 5 , 2 ) ( 4 , 1 ) , ( 4 , 2 ) (3,1),(3,2)\\ (6,5),(6,4),(6,1),(6,2)\\ (5,4),(5,1),(5,2)\\ (4,1),(4,2)\\ (3,1),(3,2)(6,5),(6,4),(6,1),(6,2)(5,4),(5,1),(5,2)(4,1),(4,2)
  所以逆序数为
τ ( 3 , 6 , 5 , 4 , 1 , 2 ) = 11 \tau(3,6,5,4,1,2)=11 τ(3,6,5,4,1,2)=11
  逆序数为奇数就是奇排列,逆序数为偶数就是偶排列。

行列式定义

  行列式的定义是一个求和,求和的每一项是从矩阵的按顺序从每一列找出不同行的元素连乘起来,他们的行号如果是奇排列就乘以-1,如果是偶排列就不变。行列式的符号是一对竖线,跟绝对值一样,或者用det表示,用数学语言就是这样表示:
∣ A ∣ = d e t ( A ) = ∑ ( − 1 ) τ ( i 1 , ⋯   , i j , ⋯   , i n ) ∏ j = 1 n a i j j |A|=det(A)=\sum(-1)^{\tau(i_1,\cdots,i_j,\cdots,i_n)}\prod_{j=1}^{n}a_{i_jj} A=det(A)=(1)τ(i1,,ij,,in)j=1naijj
  比如计算三阶矩阵的行列式,就是这样的:
∣ A ∣ = d e t ( A ) = τ ( 1 , 2 , 3 ) a 11 a 22 a 33 + τ ( 1 , 3 , 2 ) a 11 a 32 a 23 + τ ( 2 , 1 , 3 ) a 21 a 12 a 33 + τ ( 2 , 3 , 1 ) a 21 a 32 a 13 + τ ( 3 , 1 , 2 ) a 31 a 12 a 23 + τ ( 3 , 2 , 1 ) a 31 a 22 a 13 = a 11 a 22 a 33 − a 11 a 32 a 23 − a 21 a 12 a 33 + a 21 a 32 a 13 + a 31 a 12 a 23 − a 31 a 22 a 13 |A_|=det(A)\\=\tau(1,2,3)a_{11}a_{22}a_{33}+\\ \tau(1,3,2)a_{11}a_{32}a_{23}+\\ \tau(2,1,3)a_{21}a_{12}a_{33}+\\ \tau(2,3,1)a_{21}a_{32}a_{13}+\\ \tau(3,1,2)a_{31}a_{12}a_{23}+\\ \tau(3,2,1)a_{31}a_{22}a_{13}\\= a_{11}a_{22}a_{33}\\ -a_{11}a_{32}a_{23}\\ -a_{21}a_{12}a_{33}\\ +a_{21}a_{32}a_{13}\\ +a_{31}a_{12}a_{23}\\ -a_{31}a_{22}a_{13} A=det(A)=τ(1,2,3)a11a22a33+τ(1,3,2)a11a32a23+τ(2,1,3)a21a12a33+τ(2,3,1)a21a32a13+τ(3,1,2)a31a12a23+τ(3,2,1)a31a22a13=a11a22a33a11a32a23a21a12a33+a21a32a13+a31a12a23a31a22a13
  当然也可以按顺序从每行找不同列的元素相乘,结果都是一样的,上面的公式就可以改写为:
∣ A ∣ = d e t ( A ) = ∑ ( − 1 ) τ ( j 1 , ⋯   , j i , ⋯   , j n ) ∏ i = 1 n a i j i |A|=det(A)=\sum(-1)^{\tau(j_1,\cdots,j_i,\cdots,j_n)}\prod_{i=1}^{n}a_{ij_i} A=det(A)=(1)τ(j1,,ji,,jn)i=1naiji

Python实现

  按照定义计算行列式,需要求全排列,我在求全排列时,使用了Heap算法,至于Heap算法,可以参考我的博文:全排列Heap算法。全排列求出来了的话,剩余的就简单了,代码如下:

    def determinant_by_permutation(self):
        import com.youngthing.mathalgorithm.permutations.heap as hp
        n = len(self.__vectors)
        array = [i for i in range(n)]
        permutations = hp.permutations(array)
        sum = 0
        for p in permutations:
            inversions = hp.number_of_inversions(p)
            item = 1
            for i in range(n):
                item *= self.__vectors[i][p[i]]
            if (inversions & 1) == 0:
                sum += item
            else:
                sum -= item
        return sum

  测试数据:
∣ 1 − 1 − 2 − 3 3 2 1 4 2 1 1 1 6 5 4 3 ∣ = − 28 \begin{vmatrix}1 & -1 & -2 & -3\\ 3 & 2 & 1 & 4\\ 2 & 1 & 1 & 1\\ 6 & 5 & 4 & 3\\ \end{vmatrix}=-28 1326121521143413 =28
  对于算法基础不好的人来说,求全排列确实麻烦,所以我接下来要介绍一种递归到 2 × 2 2\times 2 2×2矩阵的行列式算法,实现起来比较容易,链接如下:Chiò算法

<think>好的,我现在需要帮助用户设计一个程序流程图来解算单独像对相对定相。首先,我得回顾用户之前的提问和我的回答,确保理解正确。单独像对相对定相是针对单个立体像对的相对定向,需要影像数据、内方位参数和至少5对同名点。用户现在想要一个详细的流程图,用于编程实现这个过程。 首先,我需要明确解算单独像对相对定相的步骤。通常,相对定向涉及计算基线分量和旋转角,使得同名光线在空间中相交。这通常使用共面条件方程,可能需要迭代方法如最小二乘法来解算参数。 接下来,我应该分解流程图的各个步骤。可能包括数据准备、初始化参数、构建误差方程、解算参数、判断收敛、输出结果等。需要确保每个步骤清晰,并且逻辑正确。 然后,考虑用户可能的需求。用户是开发者,需要具体的编程步骤,所以流程图应该详细到每个计算模块,例如坐标变换、构建系数矩阵、解算方程等。同时,可能需要考虑迭代过程,比如是否达到收敛条件,如参数变化小于阈值或最大迭代次数。 还要注意是否需要预处理步骤,比如数据检查和归一化,确保输入数据的正确性。例如,检查同名点数量是否足够,内方位参数是否有效。此外,坐标变换可能涉及将像点坐标转换到相机坐标系,使用内方位参数进行校正,包括去除畸变。 在构建误差方程时,可能需要使用共面条件方程,展开行列式得到线性方程,然后构建法方程进行最小二乘解算。这里需要数学公式的支持,比如矩阵运算,可能需要使用SVD或QR分解来解线性方程组。 另外,收敛判断是关键,需要设置合理的阈值,比如参数变化量小于1e-5,或者迭代次数超过50次停止,防止无限循环。同时,输出结果后可能需要后处理,如计算残差评估精度,或者将相对方位元素转换为需要的格式。 还要考虑可能的异常处理,比如迭代不收敛时如何处理,输入数据错误时的提示等,但用户可能更关注主要流程,这些可以作为扩展部分。 最后,流程图需要结构清晰,步骤连贯,从输入到输出,每个处理模块明确,判断节点合理。可能需要使用矩形框表示处理步骤,菱形表示判断,箭头连接流程。确保用户能够根据流程图编写相应的代码模块。</think>以下是为**单独像对相对定相**设计的程序解算详细流程图,结合计算步骤与关键公式: --- ### **流程图设计** ```plaintext 开始 │ ├─ **1. 数据输入与检查** │ │ │ ├─ 输入立体像对影像数据(左片、右片) │ ├─ 输入内方位参数(焦距f, 像主点x₀,y₀, 畸变参数k₁,k₂,p₁,p₂) │ ├─ 输入同名像点坐标(至少5对,左像点集P_left,右像点集P_right) │ └─ 检查数据有效性(同名点数量≥5,内参非空) │ ├─ **2. 像点坐标预处理** │ │ │ ├─ 去畸变校正: │ │ $$ x' = x + \Delta x_{\text{径向}} + \Delta x_{\text{切向}} $$ │ │ $$ \Delta x_{\text{径向}} = x(1 + k_1 r^2 + k_2 r^4) $$ │ │ $$ \Delta x_{\text{切向}} = 2p_1 xy + p_2(r^2 + 2x^2) $$ │ │ (同理处理y方向) │ │ │ └─ 转换为归一化坐标: │ $$ u = \frac{x - x_0}{f}, \quad v = \frac{y - y_0}{f} $$ │ ├─ **3. 初始化相对定向参数** │ │ │ ├─ 设置初始值:基线分量B_x=1, B_y=B_z=0,旋转角φ=ω=κ=0 │ └─ 设置收敛阈值(如Δθ<1e-5)和最大迭代次数(如50次) │ ├─ **4. 迭代解算相对方位元素** │ │ │ ├─ **4.1 构建共面条件方程** │ │ │ │ │ ├─ 对每个同名点计算共面条件: │ │ │ $$ \begin{vmatrix} │ │ │ B_x & B_y & B_z \\ │ │ │ u_1 & v_1 & 1 \\ │ │ │ u_2 & v_2 & 1 │ │ │ \end{vmatrix} = 0 $$ │ │ │ │ │ └─ 展开为线性方程: │ │ $$ a_1 \delta B_x + a_2 \delta B_y + a_3 \delta B_z + a_4 \delta \phi + a_5 \delta \omega = -e $$ │ │ │ ├─ **4.2 构建法方程** │ │ │ │ │ ├─ 对所有点构建系数矩阵A和常数项L │ │ └─ 法方程:$$ (A^T A) \Delta X = A^T L $$ │ │ │ ├─ **4.3 解算参数增量** │ │ │ │ │ ├─ 使用SVD或QR分解求解ΔX = [δB_x, δB_y, δB_z, δφ, δω]^T │ │ └─ 更新参数: │ │ $$ B_x += δB_x, \quad \phi += δ\phi, \quad ... $$ │ │ │ └─ **4.4 判断收敛** │ │ │ ├─ 若参数增量ΔX的范数 < 阈值 → 跳出迭代 │ └─ 若达到最大迭代次数 → 报错退出 │ ├─ **5. 输出结果** │ │ │ ├─ 相对方位元素:B_x, B_y, B_z, φ, ω, κ │ └─ 残差评估(单位权中误差) │ └─ 结束 ``` --- ### **关键步骤说明** 1. **去畸变校正**:消除镜头畸变对像点坐标的影响,确保几何关系准确。 2. **归一化坐标转换**:将像点坐标转换到以焦距为单位的归一化坐标系,简化后续计算。 3. **共面条件方程**:通过行列式构建方程,反映同名光线与基线共面的几何约束。 4. **迭代优化**:采用最小二乘逐步逼近最优解,需注意初值选择和收敛稳定性。 --- ### **编程注意事项** - **数值稳定性**:使用矩阵分解(如SVD)避免法方程病态问题。 - **并行计算**:同名点的误差方程可并行构建加速计算。 - **异常处理**:检测迭代发散、同名点误匹配等情况。 如果需要具体代码框架或公式展开细节,可进一步说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒过来摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值