「矩阵求法java」矩阵求法向量
今天给各位分享矩阵求法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的信息别忘了在本站进行查找喔。
发布于:2022-11-26,除非注明,否则均为
原创文章,转载请注明出处。