「矩阵求法java」矩阵求法向量

博主:adminadmin 2022-11-26 15:31:07 48

今天给各位分享矩阵求法java的知识,其中也会对矩阵求法向量进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java矩阵算法?

//STRASSEN矩阵算法

#include iostream.h

const int N=8; //常量N用来定义矩阵的大小

void main()

{

void STRASSEN(int n,float A[][N],float B[][N],float C[][N]);

void input(int n,float p[][N]);

void output(int n,float C[][N]); //函数声明部分

float A[N][N],B[N][N],C[N][N]; //定义三个矩阵A,B,C

cout"现在录入矩阵A[N][N]:"endlendl;

input(N,A);

coutendl"现在录入矩阵B[N][N]:"endlendl;

input(N,B); //录入数组

STRASSEN(N,A,B,C); //调用STRASSEN函数计算

output(N,C); //输出计算结果

}

void input(int n,float p[][N]) //矩阵输入函数

{

int i,j;

for(i=0;in;i++)

{

cout"请输入第"i+1"行"endl;

for(j=0;jn;j++)

cinp[i][j];

}

}

void output(int n,float C[][N]) //据矩阵输出函数

{

int i,j;

cout"输出矩阵:"endl;

for(i=0;in;i++)

{

coutendl;

for(j=0;jn;j++)

coutC[i][j]" ";

}

coutendlendl;

}

void MATRIX_MULTIPLY(float A[][N],float B[][N],float C[][N]) //按通常的矩阵乘法计算C=AB的子算法(仅做2阶)

{

int i,j,t;

for(i=0;i2;i++) //计算A*B--C

for(j=0;j2;j++)

{

C[i][j]=0; //计算完一个C[i][j],C[i][j]应重新赋值为零

for(t=0;t2;t++)

C[i][j]=C[i][j]+A[i][t]*B[t][j];

}

}

void MATRIX_ADD(int n,float X[][N],float Y[][N],float Z[][N]) //矩阵加法函数X+Y—Z

{

int i,j;

for(i=0;in;i++)

for(j=0;jn;j++)

Z[i][j]=X[i][j]+Y[i][j];

}

void MATRIX_SUB(int n,float X[][N],float Y[][N],float Z[][N]) //矩阵减法函数X-Y—Z

{

int i,j;

for(i=0;in;i++)

for(j=0;jn;j++)

Z[i][j]=X[i][j]-Y[i][j];

}

void STRASSEN(int n,float A[][N],float B[][N],float C[][N]) //STRASSEN函数(递归)

{

float A11[N][N],A12[N][N],A21[N][N],A22[N][N];

float B11[N][N],B12[N][N],B21[N][N],B22[N][N];

float C11[N][N],C12[N][N],C21[N][N],C22[N][N];

float M1[N][N],M2[N][N],M3[N][N],M4[N][N],M5[N][N],M6[N][N],M7[N][N];

float AA[N][N],BB[N][N],MM1[N][N],MM2[N][N];

int i,j;//,x;

if (n==2)

MATRIX_MULTIPLY(A,B,C);//按通常的矩阵乘法计算C=AB的子算法(仅做2阶)

else

{

for(i=0;in/2;i++) //////////

for(j=0;jn/2;j++)

{

A11[i][j]=A[i][j];

A12[i][j]=A[i][j+n/2];

A21[i][j]=A[i+n/2][j];

A22[i][j]=A[i+n/2][j+n/2];

B11[i][j]=B[i][j];

B12[i][j]=B[i][j+n/2];

B21[i][j]=B[i+n/2][j];

B22[i][j]=B[i+n/2][j+n/2];

} //将矩阵A和B式分为四块

MATRIX_SUB(n/2,B12,B22,BB); //////////

STRASSEN(n/2,A11,BB,M1);//M1=A11(B12-B22)

MATRIX_ADD(n/2,A11,A12,AA);

STRASSEN(n/2,AA,B22,M2);//M2=(A11+A12)B22

MATRIX_ADD(n/2,A21,A22,AA);

STRASSEN(n/2,AA,B11,M3);//M3=(A21+A22)B11

MATRIX_SUB(n/2,B21,B11,BB);

STRASSEN(n/2,A22,BB,M4);//M4=A22(B21-B11)

MATRIX_ADD(n/2,A11,A22,AA);

MATRIX_ADD(n/2,B11,B22,BB);

STRASSEN(n/2,AA,BB,M5);//M5=(A11+A22)(B11+B22)

MATRIX_SUB(n/2,A12,A22,AA);

MATRIX_SUB(n/2,B21,B22,BB);

STRASSEN(n/2,AA,BB,M6);//M6=(A12-A22)(B21+B22)

MATRIX_SUB(n/2,A11,A21,AA);

MATRIX_SUB(n/2,B11,B12,BB);

STRASSEN(n/2,AA,BB,M7);//M7=(A11-A21)(B11+B12)

//计算M1,M2,M3,M4,M5,M6,M7(递归部分)

MATRIX_ADD(N/2,M5,M4,MM1); //////////

MATRIX_SUB(N/2,M2,M6,MM2);

MATRIX_SUB(N/2,MM1,MM2,C11);//C11=M5+M4-M2+M6

MATRIX_ADD(N/2,M1,M2,C12);//C12=M1+M2

MATRIX_ADD(N/2,M3,M4,C21);//C21=M3+M4

MATRIX_ADD(N/2,M5,M1,MM1);

MATRIX_ADD(N/2,M3,M7,MM2);

MATRIX_SUB(N/2,MM1,MM2,C22);//C22=M5+M1-M3-M7

for(i=0;in/2;i++)

for(j=0;jn/2;j++)

{

C[i][j]=C11[i][j];

C[i][j+n/2]=C12[i][j];

C[i+n/2][j]=C21[i][j];

C[i+n/2][j+n/2]=C22[i][j];

} //计算结果送回C[N][N]

}

}

用java怎么写矩阵乘法?

import java.util.Scanner; 

public class Matrix { 

public double[][] create() { 

Scanner sc = new Scanner(System.in) ; 

System.out.print("请输入矩阵的行高:"); 

int a = sc.nextInt() ; 

System.out.print("请输入矩阵的列宽:"); 

int b = sc.nextInt() ; 

double[][] x = new double[a][b] ; 

for(int i=0;ilt;a;i++){ 

for(int j=0;jlt;b;j++){ 

System.out.print("请输入元素x["+i+"]["+j+"]的值:" ); 

x[i][j] = sc.nextDouble() ; 

return x ; 

public double[][] multiply(double[][] x,double[][] y){ 

double[][] result = null ; 

int a = x[0].length ; 

int b = y.length ; 

if(a != b){ 

System.out.println("输入的维数不匹配,不能进行运算"); 

}else{ 

int c = x.length ; 

int d = y[0].length ; 

result = new double[c][d] ; 

for(int i=0;ilt;c;i++){ 

for(int j=0;jlt;d;j++){ 

double sum = 0 ; 

for(int k=0;klt;a;k++){ 

sum += x[i][k]*y[k][j] ; 

result[i][j] = sum ; 

return result ; 

public void print(double[][] x){ 

System.out.println("矩阵为:"); 

for(int i=0;ilt;x.length;i++){ 

for(int j=0;jlt;x[i].length;j++){ 

System.out.print(x[i][j] + " ") ; 

System.out.println(); 

测试类: 

public class TestMatrix { 

public static void main(String[] args) { 

Matrix m = new Matrix() ; 

//double[][] x = {{1,2},{3,2}} ; 

//double[][] y = {{1,2,1},{2,3,3}} ; 

System.out.println("创建第一个数组:") ; 

double[][] x = m.create() ; 

m.print(x) ; //用来验证输入的是否和你一样的,没啥作用 

System.out.println("创建第二个数组:"); 

double[][] y = m.create() ; 

m.print(y) ; //用来验证输入的是否和你一样的,没啥作用 

double[][] result = m.multiply(x, y) ; 

if(result == null){ 

return ; //如果输入的矩阵不能运算就不输出结果了。 

m.print(result) ; 

}

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

java 求矩阵乘法及行列式的值

/**

 * 矩阵乘法

 * @param a

 * @param b

 * @return

 */

     public static double[][] mulMatrix(double[][] a,double[][] b){

      double[][] c=new double[a.length][b[0].length];

      //相乘的两个行列式需要满足,第一个行列式的列于第二个行列式的行相等

      if(a[0].length!=b.length){

      System.out.println("Wrong parameters.");

      return c;

      }

      //若A为mXn矩阵,B为nXp矩阵,返回一个mXp的矩阵

      for (int i = 0; i  c.length; i++) {

for (int j = 0; j  c[0].length; j++) {

               for (int j2 = 0; j2  a[0].length; j2++) {

c[i][j]=c[i][j]+a[i][j2]*b[j2][j];

}

}

}

      return c;

     }

/**

 * 计算行列式的值

 * @param a

 * @return

 */

    static double determinant(double[][] a){

        double result2 = 0;

        if(a.length2){

         //每次选择第一行展开

            for(int i=0;ia[0].length;i++){

                //系数符号

                double f=Math.pow(-1,i);

                //求余子式

                double[][] yuzs=new double[a.length-1][a[0].length-1];

                for (int j = 0; j  yuzs.length; j++) {

for (int j2 = 0; j2  yuzs[0].length; j2++) {

//去掉第一行,第i列之后的行列式即为余子式

if(j2i){

yuzs[j][j2]=a[j+1][j2];

}else {

yuzs[j][j2]=a[j+1][j2+1];

}

}

                //行列式的拉普拉斯展开式,递归计算

                result2+=a[0][i]*determinant(yuzs)*f;

            }

        }

        else{

         //两行两列的行列式使用公式

            if(a.length==2){

                result2=a[0][0]*a[1][1]-a[0][1]*a[1][0];

            }

            //单行行列式的值即为本身

            else{

                result2=a[0][0];

            }

        }

        return result2;

    }

转自

java如何编写求矩阵的逆矩阵

/**

* 求矩阵的逆矩阵 为矩阵右加一个单位矩阵后进行初等行变换,当左边变成单位矩阵时,右边就是求得的逆矩阵。 矩阵的初等行变换法则

* (1)交换变换:交换两行 (2)倍法变换:给一行数据乘以一个非0常数 (3)消法变换:把一行所有元素的k倍加到另一行的对应元素上去

* 将上述规则中的行换成列同样有效 只有方阵才可能有逆矩阵!

*

* @return

*/

public Matrix inverseMatrix() {

if (!this.isSquareMatrix()) {

System.out.println("不是方阵没有逆矩阵!");

return null;

}

// 先在右边加上一个单位矩阵。

Matrix tempM = this.appendUnitMatrix();

// 再进行初等变换,把左边部分变成单位矩阵

double[][] tempData = tempM.getMatrixData();

int tempRow = tempData.length;

int tempCol = tempData[0].length;

// 对角线上数字为0时,用于交换的行号

int line = 0;

// 对角线上数字的大小

double bs = 0;

// 一个临时变量,用于交换数字时做中间结果用

double swap = 0;

for (int i = 0; i tempRow; i++) {

// 将左边部分对角线上的数据等于0,与其他行进行交换

if (tempData[i][i] == 0) {

if (++line = tempRow) {

System.out.println("此矩阵没有逆矩阵!");

return null;

}

for (int j = 0; j tempCol; j++) {

swap = tempData[i][j];

tempData[i][j] = tempData[line][j];

tempData[line][j] = swap;

}

// 当前行(第i行)与第line行进行交换后,需要重新对第i行进行处理

// 因此,需要将行标i减1,因为在for循环中会将i加1。

i--;

// 继续第i行处理,此时第i行的数据是原来第line行的数据。

continue;

}

// 将左边部分矩阵对角线上的数据变成1.0

if (tempData[i][i] != 1) {

bs = tempData[i][i];

for (int j = tempCol - 1; j = 0; j--) {

tempData[i][j] /= bs;

}

// 将左边部分矩阵变成上对角矩阵,

// 所谓上对角矩阵是矩阵的左下角元素全为0

for (int iNow = i + 1; iNow tempRow; iNow++) {

for (int j = tempCol - 1; j = i; j--) {

tempData[iNow][j] -= tempData[i][j] * tempData[iNow][i];

}

}

}

}

// 将左边部分矩阵从上对角矩阵变成单位矩阵,即将矩阵的右上角元素也变为0

for (int i = 0; i tempRow - 1; i++) {

for (int iNow = i; iNow tempRow - 1; iNow++) {

for (int j = tempCol - 1; j = 0; j--) {

tempData[i][j] -= tempData[i][iNow + 1]

* tempData[iNow + 1][j];

}

}

}

// 右边部分就是它的逆矩阵

Matrix c = null;

int cRow = tempRow;

int cColumn = tempCol / 2;

double[][] cData = new double[cRow][cColumn];

// 将右边部分的值赋给cData

for (int i = 0; i cRow; i++) {

for (int j = 0; j cColumn; j++) {

cData[i][j] = tempData[i][cColumn + j];

}

}

// 得到逆矩阵,返回

c = new Matrix(cData);

return c;

}

矩阵求法java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于矩阵求法向量、矩阵求法java的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。