zoukankan      html  css  js  c++  java
  • 线性代数 | 行列式的计算

    Java代码:

      1 import java.util.*;
      2 import java.io.*;
      3 
      4 public class Main {
      5 
      6     public static void main(String[] args) {
      7         
      8         
      9         int[][] matrix1={
     10                 {3,-2},
     11                 {2,1}
     12         };
     13         int[][] matrix2={
     14                 {1,2,-4},
     15                 {-2,2,1},
     16                 {-3,4,-2}
     17         };        
     18         Determinant D=new Determinant(matrix2);
     19         int ans=D.get();
     20         System.out.print(ans);
     21     }
     22 
     23 }
     24 
     25 class Determinant{
     26     int N=0;//行列式阶数
     27     int [][] D;//行列式
     28     int ans=0;
     29     Determinant(){}
     30     Determinant(String path){//通过文件路径,输入文件来读取邻接矩阵
     31         String content=MyFile.readFile(path);//读取文件内容
     32         String lines[]=content.split("
    ");
     33         String probe[];
     34         N=lines.length;
     35         D=new int[N][N];//刻画邻接矩阵大小
     36         int i,j;
     37         for(i=0;i<lines.length;i++){
     38             probe=lines[i].split(" ");
     39             for(j=0;j<probe.length;j++){
     40                 D[i][j]=Integer.valueOf(probe[j]).intValue();//要对integer进行拆包
     41             }
     42         }
     43         calcAns();
     44     }
     45     Determinant(int[][] matrix){
     46         N=matrix.length;
     47         D=new int[N][N];//刻画邻接矩阵大小
     48         int i,j;
     49         for(i=0;i<N;i++) for(j=0;j<N;j++) D[i][j]=matrix[i][j];
     50         calcAns();
     51     }
     52     private void calcAns(){
     53         int i,j,k;
     54         int x[][]=getFullArrangement(N);
     55         for(i=0;i<x.length;i++){//对于每个下标的排列结果
     56             int sum=1;
     57             for(j=0;j<N;j++){//对于每一行
     58                 sum*=D[j][x[i][j]];
     59             }
     60             sum*=(InverseNum(x[i])%2==1 ? -1 : 1);
     61             ans+=sum;
     62         }
     63     }
     64     public int get(){
     65         return ans;
     66     }
     67     private int InverseNum(int[] vec){
     68         int i,j;
     69         int len=vec.length;
     70         int re=0;
     71         for(i=0;i<len-1;i++){
     72             for(j=i+1;j<len;j++){
     73                 if(vec[i]>vec[j])
     74                     re++;
     75             }
     76         }
     77         return re;
     78     }
     79     private int[][] getFullArrangement(int n){
     80         int [][] re;
     81         if(n>1){
     82             int [][] pre=getFullArrangement(n-1);
     83             int row=pre.length;
     84             int col=pre[0].length;
     85             re=new int[row*n][n];
     86             int i,j,k;
     87             for(i=0;i<row;i++){
     88                 for(k=0;k<n;k++){
     89                     //拷贝父结点
     90                     for(j=0;j<n-1;j++)
     91                         re[i*n+k][j]=pre[i][j];
     92                     re[i*n+k][n-1]=n-1;
     93                     swap(re[i*n+k],n-1,k);
     94                 }
     95             }
     96         }else{
     97             re=new int[1][1];
     98             re[0][0]=0;
     99         }
    100         return re;
    101     }
    102     private void swap(int[] arr,int a,int b){
    103         int tmp=arr[a];
    104         arr[a]=arr[b];
    105         arr[b]=tmp;
    106     }
    107 }
    108 
    109 class MyFile{
    110 
    111     /**
    112      * 创建文件
    113      * @param fileName  文件名称
    114      * @param filecontent   文件内容
    115      * @return  是否创建成功,成功则返回true
    116      */
    117     public static boolean createFile(String fileName){
    118         boolean bool = false;
    119         File file = new File(fileName);
    120         try {
    121             //如果文件不存在,则创建新的文件
    122             if(!file.exists()){
    123                 file.createNewFile();
    124                 bool = true;
    125                 System.out.println("success create file,the file is "+fileName);
    126             }
    127         } catch (Exception e) {
    128             e.printStackTrace();
    129         }
    130         return bool;
    131     }
    132     
    133     /**
    134      * 向文件中写入内容
    135      * @param filepath 文件路径与名称
    136      * @param newstr  写入的内容
    137      * @return
    138      * @throws IOException
    139      */
    140     public static boolean writeFile(String filepath,String newstr) throws IOException{
    141         boolean bool = false;
    142         String filein = newstr+"
    ";//新写入的行,换行
    143         String temp  = "";
    144         
    145         FileInputStream fis = null;
    146         InputStreamReader isr = null;
    147         BufferedReader br = null;
    148         FileOutputStream fos  = null;
    149         PrintWriter pw = null;
    150         try {
    151             File file = new File(filepath);//文件路径(包括文件名称)
    152             //将文件读入输入流
    153             fis = new FileInputStream(file);
    154             isr = new InputStreamReader(fis);
    155             br = new BufferedReader(isr);
    156             StringBuffer buffer = new StringBuffer();
    157             
    158             //文件原有内容
    159             for(int i=0;(temp =br.readLine())!=null;i++){
    160                 buffer.append(temp);
    161                 // 行与行之间的分隔符 相当于“
    ”
    162                 buffer = buffer.append(System.getProperty("line.separator"));
    163             }
    164             buffer.append(filein);
    165             
    166             fos = new FileOutputStream(file);
    167             pw = new PrintWriter(fos);
    168             pw.write(buffer.toString().toCharArray());
    169             pw.flush();
    170             bool = true;
    171         } catch (Exception e) {
    172             // TODO: handle exception
    173             e.printStackTrace();
    174         }finally {
    175             //不要忘记关闭
    176             if (pw != null) {
    177                 pw.close();
    178             }
    179             if (fos != null) {
    180                 fos.close();
    181             }
    182             if (br != null) {
    183                 br.close();
    184             }
    185             if (isr != null) {
    186                 isr.close();
    187             }
    188             if (fis != null) {
    189                 fis.close();
    190             }
    191         }
    192         return bool;
    193     }
    194  
    195     /**
    196      * 删除文件
    197      * @param fileName 文件名称
    198      * @return
    199      */
    200     public static boolean delFile(String fileName){
    201         boolean bool = false;
    202         File file  = new File(fileName);
    203         try {
    204             if(file.exists()){
    205                 file.delete();
    206                 bool = true;
    207             }
    208         } catch (Exception e) {
    209             // TODO: handle exception
    210         }
    211         return bool;
    212     }
    213     public static String readFile(String fileName) {
    214         File file = new File(fileName);
    215         Reader reader = null;
    216         String content=new String();
    217         try {
    218             // 一次读一个字符
    219             reader = new InputStreamReader(new FileInputStream(file));
    220             int tempchar;
    221             while ((tempchar = reader.read()) != -1) {
    222                 // 对于windows下,
    这两个字符在一起时,表示一个换行。
    223                 // 但如果这两个字符分开显示时,会换两次行。
    224                 // 因此,屏蔽掉
    ,或者屏蔽
    。否则,将会多出很多空行。
    225                 if (((char) tempchar) != '
    ') {
    226                  //   System.out.print((char) tempchar);
    227                     content+=((char) tempchar);
    228                 }
    229             }
    230             reader.close();
    231         } catch (Exception e) {
    232             e.printStackTrace();
    233         }
    234         return content;
    235     }
    236 }
  • 相关阅读:
    HDU2013 蟠桃记
    HDU2012 素数判定
    I00030 Grades conversion
    HDU2011 多项式求和
    HDU2009 求数列的和
    HDU2005 第几天?【日期计算】
    HDU2004 成绩转换
    HDU2006 求奇数的乘积
    HDU2007 平方和与立方和【序列处理】
    HDU2010 水仙花数【进制+趣味程序】
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7667894.html
Copyright © 2011-2022 走看看