java实现的n*n矩阵求值及求逆矩阵算法示例

本文实例讲述了java实现的n*n矩阵求值及求逆矩阵算法。分享给大家供大家参考,具体如下:

先来看看运行结果:

java版的写出来了,用的跟c语言相同的算法,然后看看能不能以后加个框做成程序:

import java.math.*;
import java.util.*;
import java.text.*;
public class matrix {
  static int map1[][]=new int [110][110];
  static int just[][]=new int [110][110];
  public static void printf(int n,int map[][])
  {
    int i,j;
    for(i=1;i<=n;i++ )
    {
      for(j=1;j<n;j++)
        System.out.print(map[i][j]+" ");
      System.out.println(map[i][j]);
    }
  }
  public static void get(int numi,int numj,int map[][],int n)
  {
    int i,j,k,l;
    for(i=0;i<n+10;i++)
      for(j=0;j<n+10;j++)
        just[i][j]=1;
    for(i=1;i<=n-1;i++)//求余子式矩阵
      for(j=1;j<=n-1;j++)
      {
        if(i>=numi&&j<numj)
        just[i][j]=map[i+1][j];
        else if(i>=numi&&j>=numj)
        just[i][j]=map[i+1][j+1];
        else if(i<numi&&j>=numj)
        just[i][j]=map[i][j+1];
        else if(i<numi&&j<numj)
        just[i][j]=map[i][j];
      }
  }
  //static int map[][]=new int [110][110];
  public static int getans(int nn)
  {
    int map[][]=new int [110][110];
    for(int i=1;i<=nn;i++)
    for(int j=1;j<=nn;j++)
    map[i][j]=just[i][j];
    if(nn==2)
    return map[1][1]*map[2][2]-map[1][2]*map[2][1];
    else if(nn==1)
    return map[1][1];
    else
    {
      int cnb=0;
      for(int i=1;i<=nn;i++)
      {
        get(1,i,map,nn);//得到当前余子式 just
      // printf("pay attention!\n");
        //print(map,nn);
        //print(just,nn-1);
        if(i%2==1)
        cnb+=map[1][i]*getans(nn-1);
        else
        cnb-=map[1][i]*getans(nn-1);
      }
      return cnb;
    }
  }
  public static int gcd(int m,int n)
  {
//   if(m<n)
//   matrix.gcd(n,m);
//   if(n==0)
//   return m;
//
//   else
//   return matrix.gcd(n,m%n);
    int mm=m;
    int nn=n;
    if(mm<nn)
    {
      int c=mm;
      mm=nn;
      nn=c;
    }
    int w=1;
    while(w!=0)
    {
      w=mm%nn;
      mm=nn;
      nn=w;
    }
    return mm;
  }
  public static void ans(int n,int m)
  {
    if(n*m<0)
    {
      System.out.print("-");
      ans(Math.abs(n),Math.abs(m));
      return ;
    }
    if(m==1)
    System.out.print(n+"\t");
    else if(n%m==0)
      System.out.print(n/m+"\t");
    else
      System.out.print((n/matrix.gcd(m, n))+"/"+(m/matrix.gcd(m, n))+"\t");
  }
  public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Scanner cin=new Scanner(System.in);
    int i,j,k,l,m,p;
    while(true)
    {
      int n=cin.nextInt();
      int ans=0;
      for(i=0;i<n+10;i++)
        for(j=0;j<n+10;j++)
          map1[i][j]=1;
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
          map1[i][j]=cin.nextInt();
          just[i][j]=map1[i][j];
        }
      int ans1=matrix.getans(n);
      System.out.println("矩阵的值为:");
      System.out.println(ans1);
      int map2[][]=new int [110][110];
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
          map2[i][j]=map1[j][i];
          just[i][j]=map2[i][j];
        }
      System.out.println("转置矩阵为:");
      matrix.printf(n, map2);
      int help2=matrix.getans(n);
      System.out.println(help2);
      if(help2==0)
      {
        System.out.println("No inverse matrix");
        continue;
      }
      System.out.println("逆矩阵为:");
      for(i=1;i<=n;i++)
      {
        for(j=1;j<=n;j++)
        {
          matrix.get(i, j, map2, n);
          //boolean b=((i+j)%2==0);
          if((i+j)%2==0)
          matrix.ans(matrix.getans(n-1), help2);
          else
          matrix.ans(matrix.getans(n-1)*-1, help2);
        }
        System.out.println();
      }
      System.out.println();
    }
  }
}

更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

(0)

相关推荐

  • java数据结构与算法之双向循环队列的数组实现方法

    本文实例讲述了java数据结构与算法之双向循环队列的数组实现方法.分享给大家供大家参考,具体如下: 需要说明的是此算法我并没有测试过,这里给出的相当于伪代码的算法思想,所以只能用来作为参考! package source; public class Deque { private int maxSize; private int left; private int right; private int nItems; private long[] myDeque; //constructor p

  • java 二维数组矩阵乘法的实现方法

    复制代码 代码如下: public interface IMatrixMultiple {     public int[][] mmltiple(int[][]a ,int [][]b); } ?public class MatrixMultiple implements IMatrixMultiple { @Override    public int[][] mmltiple(int[][] a, int[][] b) {         int [][] result = new int

  • 图解程序员必须掌握的Java常用8大排序算法

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,分享给大家一起学习. 分类 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看8种排序之间的关系: 1.直接插入排序 (1)基本思想

  • 简单讲解奇偶排序算法及在Java数组中的实现

    奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] 第一次比较奇数列,奇数列与它的邻居偶数列比较,如6和2比,4和1比,5和9比 [6 2 4 1 5 9] 交换后变成 [2 6 1 4 5 9] 第二次比较偶数列,即6和1比,5和5比 [2 6 1 4 5 9] 交换后变成 [2 1 6 4 5 9] 第三趟又是奇数列,选择的是2,6,5分别与它们的邻居列比较 [2 1 6 4 5 9] 交

  • Java中打乱一个数组的2种公平算法分享

    公平算法,打乱数组 这是前几天面试的时候遇见的一道题目,看到这个题首先想到了洗牌程序: 方法一:洗牌程序原理 在java.util包中的Collections类中的 shuffle方法,现在手工实现以下代码如下: package test.ms; import java.util.Random; public class Redistribute2 { public static void main(String[] args) { //define the array int[] s = {1

  • 详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进行移动 三.有序数组和无序数组共同优缺点 删除数据时必须把后面的数据向前移动来填补删除项的漏洞 四.代码实现 public class OrderArray { private int nElemes; //记录数组长度 private long[] a; /** * 构造函数里面初始化数组 赋值默

  • Java实现的求逆矩阵算法示例

    本文实例讲述了Java实现的求逆矩阵算法.分享给大家供大家参考,具体如下: package demo; public class MatrixInverse { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { int T0; int T1; int T2; double Num; int Cha; double [][] B; if(N>0) { Cha=0; B=new double[N][N]; Num=

  • Java对数组实现选择排序算法的实例详解

    一. 算法描述     选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成. 以下面5个无序的数据为例: 56 12 80 91 20(文中仅细化了第一趟的选择过程) 第1趟:12 56 80 91 20 第2趟:12 20 80 91 56 第3趟:12 20 56 91 80 第4趟

  • java 矩阵乘法的mapreduce程序实现

    java 矩阵乘法的mapreduce程序实现 map函数:对于矩阵M中的每个元素m(ij),产生一系列的key-value对<(i,k),(M,j,m(ij))> 其中k=1,2.....知道矩阵N的总列数;对于矩阵N中的每个元素n(jk),产生一系列的key-value对<(i , k) , (N , j ,n(jk)>, 其中i=1,2.......直到i=1,2.......直到矩阵M的总列数. map package com.cb.matrix; import stati

  • java实现任意矩阵Strassen算法

    本例输入为两个任意尺寸的矩阵m * n, n * m,输出为两个矩阵的乘积.计算任意尺寸矩阵相乘时,使用了Strassen算法.程序为自编,经过测试,请放心使用.基本算法是: 1.对于方阵(正方形矩阵),找到最大的l, 使得l = 2 ^ k, k为整数并且l < m.边长为l的方形矩阵则采用Strassen算法,其余部分以及方形矩阵中遗漏的部分用蛮力法. 2.对于非方阵,依照行列相应添加0使其成为方阵. StrassenMethodTest.java package matrixalgorit

  • java字符串相似度算法

    本文实例讲述了java字符串相似度算法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: public class Levenshtein {     private int compare(String str, String target) {         int d[][]; // 矩阵         int n = str.length();         int m = target.length();         int i; // 遍历str的      

随机推荐