行列式(三):n阶行列式

  1.数学定义

    n阶行列式定义如下:



2.算法实现

  函数名: GetValue()

  功能:返回一个行列式的值

    Private Function GetValue()
        Dim gValue As Double
        Dim tempResultList As New List(Of Array)
        Dim tempNumArray(RankLength - 1) As Integer ‘要进行全排列的序列
        For i = 0 To RankLength - 1
            tempNumArray(i) = i
        Next
        GetFullPerm(tempNumArray, 0, tempResultList)
        Dim temp As Double
        Dim tempData() As Integer
        For i = 0 To tempResultList.Count - 1
            temp = 1
            tempData = tempResultList(i)
            For j = 0 To RankLength - 1
                temp = temp * TableData(j, tempData(j))
            Next
            temp = Math.Pow(-1, GetInverseNum(tempData)) * temp
            gValue += temp
        Next
        Return gValue
    End Function


3.完整的行列式类(determinant)

  使用示例:

Dim d As New Determinant(3)
d.Item(1, 1) = 1
d.Item(2, 2) = 2
d.Item(3, 3) = 4
Console.write(d.value)

Public Class Determinant
    Private TableData(,) As Double
    Private RankLength As Integer
    ‘行列式的阶
    Public ReadOnly Property Rank()
        Get
            Return RankLength
        End Get
    End Property
    ‘行列式第iRow行第iCol列的元素
        Public Property Item(ByVal iRow As Integer, ByVal iCol As Integer)
            Get
                Return TableData(iRow - 1, iCol - 1)
            End Get
            Set(ByVal value)
                TableData(iRow - 1, iCol - 1) = value
            End Set
        End Property
    Public ReadOnly Property value()
        Get
            Return GetValue()
        End Get
    End Property
    Public Sub New(ByVal nRank As Integer)
        Dim tempArray(nRank - 1, nRank - 1) As Double
        TableData = tempArray
        RankLength = nRank
    End Sub
    ‘求行列式的值
    Private Function GetValue()
        Dim gValue As Double
        Dim tempResultList As New List(Of Array)
        Dim tempNumArray(RankLength - 1) As Integer ‘要进行全排列的序列
        For i = 0 To RankLength - 1
            tempNumArray(i) = i
        Next
        GetFullPerm(tempNumArray, 0, tempResultList)
        Dim temp As Double
        Dim tempData() As Integer
        For i = 0 To tempResultList.Count - 1
            temp = 1
            tempData = tempResultList(i)
            For j = 0 To RankLength - 1
                temp = temp * TableData(j, tempData(j))
            Next
            temp = Math.Pow(-1, GetInverseNum(tempData)) * temp
            gValue += temp
        Next
        Return gValue
    End Function
    ‘全排列
    Private Sub GetFullPerm(ByVal NumArray() As Integer, ByVal LeftIndex As Integer, ByRef Result As List(Of Array))
        Dim temp As Integer
        If LeftIndex = NumArray.Length - 1 Then
            Dim tempArray(NumArray.Length - 1) As Integer
            NumArray.CopyTo(tempArray, 0)
            Result.Add(tempArray)
        Else
            temp = NumArray(LeftIndex)
            For i = LeftIndex To NumArray.Length - 1
                NumArray(LeftIndex) = NumArray(i)
                NumArray(i) = temp ‘对换
                GetFullPerm(NumArray, LeftIndex + 1, Result)
                NumArray(i) = NumArray(LeftIndex)
                NumArray(LeftIndex) = temp ‘还原对换
            Next
        End If
    End Sub
    ‘逆序数
    Private Function GetInverseNum(ByVal NumArray() As Integer)
        Dim Num As Integer = 0
        For i = 0 To NumArray.Length - 1
            For j = i To NumArray.Length - 1
                If NumArray(i) > NumArray(j) Then Num += 1
            Next
        Next
        Return Num
    End Function
End Class

时间: 2024-10-11 16:32:52

行列式(三):n阶行列式的相关文章

Herding(hdu4709)三点运用行列式求面积

Herding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1553 Accepted Submission(s): 440 Problem Description Little John is herding his father's cattles. As a lazy boy, he cannot tolerate chasing t

n阶行列式

1.首先,在学习n阶行列式定义前,我们先介绍一下排列.逆序数及对换的概念: (1)排列定义:由 1,2,-,n 组成的一个有序数组称为一个 n 级排列(也叫做这 n 个元素的一个全          排列). 例子:所有的 3 级排列: 123     132     213     231     312     321 排列的分类:分为奇排列和偶排列:逆序数是奇数的排列称为奇排列:逆序数是偶数或 0 的排列            称为偶排列 (2)逆序数的定义:在一个排列中,如果一对数的前后

利用“三角化”计算行列式快速求解程序(验证过很多题目的,绝对准确)

#include<iostream>#include<cmath>using namespace std;void main(){ //输入行列式开始 int n,i,j,a[10][10],T[10],max[10],b[10],k,q,p; float t[10][10],c,sum=-1; cout<<"阶数:"; cin>>n; cout<<"行列式:"<<endl; for(i=1;i

计算n阶行列式的模板

之前在学习计数问题的时候也在网上找了很多关于行列式的资料 但是发现很多地方都只介绍2\3阶的情况 一些论文介绍的方法又看不懂 然后就一直耽搁着 今天恰好出到这样的题目 发现标算的代码简介明了 还挺开心的 function det(a:arr):int64; var i,j,k:longint; t,ans:int64; begin ans:=1; for i:=1 to n do begin for j:=i+1 to n do while a[j,i]<>0 do begin t:=a[i,

n阶行列式算法(c程序)

#include<stdio.h> #include<math.h> #define N 100 //N比输入的阶数大即可 int main() {   int n,a[N][N],i,j; void row_col_times(int b[N][N],int n); printf("请输入方阵阶数:\n"); scanf("%d",&n); printf("请输入%d阶的方阵(用空格隔开)\n",n); for(

n阶行列式的全排列求解(Java)

上一个随笔,我介绍了全排列的递归求解,其中还有排列的逆序数等代码,这次我来介绍如何使用全排列计算行列式的值. 使用全排列求行列式的值,简单的描述就是: 对这个行列式每一行选取一个数,这些数处于行列式的不同的列,将这些数相乘,结果记为A_1 将这些数的列标按行标从上到下的顺序排列,如果这个排列的逆序数为偶数,A_1加个正号+A_1,否则加个负号-A_1 由排列组合知识我们知道我们一共能从行列式中取出n!种情况.他们的和就是行列式的值 (刚开始用博客园,没找到插入latex的地方,我就截个图了...

【矩阵与行列式】矩阵和行列式学习笔记

开始从ToDoList里挑东西来杀. 感觉矩阵和行列式这两个跟很多东西都有关而且接触最少 所以先从它们开始补>w< P.S.看了很多资料,他们对矩阵和行列式这些东西的介绍都很丧病-我会尽量用通俗的语言来写我的笔记= =如果您不喜欢这种风格QAQ那我也没办法了请隔壁看别人的吧 ---------线割分是我>w<--------------– 什么是矩阵? 矩阵是n*m个数在n*m这个二维区域内的一个排列,是一个横纵排列的二维数字表格. 也就是说,矩阵只是一些数的一种存储形式. 通常我

[线性代数] 1、行列式

第一章  行列式 §1  二阶与三阶行列式------------------>行列式的概念    §2  全排列及其逆序数    §3  n 阶行列式的定义    §4  对换------------------------------>行列式的性质及计算    §5  行列式的性质    §6  行列式按行(列)展开    §7  克拉默法则------------------------>线性方程组的求解. 1.1.二元线性方程组与二阶行列式 PS:对角线相乘[二阶行列式] 1.2

【学习笔记】线性代数学习笔记

慢慢的学吧--先挖个坑提醒自己好好填[雾] 一.行列式相关 n阶行列式定义:Σ(-1)t a1p1*a2p2*....anpn(p∈(1~n的全排列),t为此排列中的逆序对个数) 相关性质: 1.行列式与它的转置行列式相等--行列式的性质凡是对行成立的,对于列也成立. 2.互换行列式的两行(列),行列式变号--若行列式有两列(行)完全相同,此行列式=0. 3.行列式的某一行(列)中所有的元素*k,等于用k乘上此行列式. 4.行列式中若有两行的元素成比例,则此行列式=0. 原文地址:https:/