关于矩阵的操作:
1、java:
package main.java.jm.algebra;
import java.math.BigDecimal;
public class Matrix {
private BigDecimal[][] mat;
// 矩阵行数
private int rowNum;
// 矩阵列数
private int colNum;
// Matrix的构造函数
public Matrix(int rowNum,int colNum){
this.rowNum = rowNum;
this.colNum = colNum;
mat = new BigDecimal[rowNum][colNum];
// 初始化矩阵
initializeMatrix();
}
// initializeMatrix:初始化矩阵,将矩阵所有元素都设为0
private void initializeMatrix(){
for (int i = 0; i<rowNum;i++){
for (int j = 0;j<colNum;j++){
mat[i][j] = new BigDecimal(0.0);
}
}
}
// setValue:用于设置矩阵元素,x1,x2表示矩阵行和列,value是要设置的值
public void setValue(int x1,int x2,double value){
mat[x1][x2] = new BigDecimal(value);
}
// setValue的重载方法
public void setValue(int x1,int x2,BigDecimal value){
mat[x1][x2] = value;
}
// 指定行列,获取矩阵对应位置上元素
public BigDecimal getValue(int x1, int x2){
return mat[x1][x2];
}
// 获取矩阵行数
public int getRowNum(){
return rowNum;
}
// 获取矩阵列数
public int getColNum(){
return colNum;
}
// 重写默认的toString方法,用更加友好的方式展现出来
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
for (int i = 0 ;i <rowNum;i++){
for (int j = 0;j<colNum;j++){
sb.append(String.format("%15f",mat[i][j].doubleValue()));
}
}
return sb.toString();
}
}
package main.java.jm.algebra;
import java.math.BigDecimal;
public class AlgebraUtil {
// 1、矩阵加法
public final static Matrix add(Matrix a,Matrix b){
// a,b矩阵若为空则直接返回
if(a == null || b == null){
return null;
}
// 保证a,b具有相同的列数
if(a.getRowNum() != b.getRowNum() || a.getColNum()!=b.getColNum()){
return null;
}
// 创建新矩阵resultMat,用于保存相加的结果
Matrix resultMat = new Matrix(a.getRowNum(), a.getColNum());
// 遍历矩阵a和b,并让元素相加
for (int i = 0;i<resultMat.getRowNum();i++){
for (int j = 0; j<resultMat.getColNum();j++){
BigDecimal value = a.getValue(i,j).add(b.getValue(i,j));
resultMat.setValue(i,j,value);
}
}
return resultMat;
}
// 2、矩阵减法
public final static Matrix substract(Matrix a,Matrix b){
// a,b矩阵若为空则直接返回
if(a == null || b == null){
return null;
}
// 保证a,b具有相同的列数
if(a.getRowNum() != b.getRowNum() || a.getColNum()!=b.getColNum()){
return null;
}
// 创建新矩阵resultMat,用于保存相减的结果
Matrix resultMat = new Matrix(a.getRowNum(), a.getColNum());
// 遍历矩阵a和b,并让元素相加
for (int i = 0;i<resultMat.getRowNum();i++){
for (int j = 0; j<resultMat.getColNum();j++){
BigDecimal value = a.getValue(i,j).subtract(b.getValue(i,j));
resultMat.setValue(i,j,value);
}
}
return resultMat;
}
// 3、矩阵相乘
public final static Matrix multiply(Matrix a,Matrix b){
// a,b矩阵若为空则直接返回
if(a == null || b == null){
return null;
}
// 保证a列数,b行数相同
if(a.getColNum()!=b.getRowNum()){
return null;
}
// 创建新矩阵resultMat,用于保存相加的结果
Matrix resultMat = new Matrix(a.getRowNum(), a.getColNum());
// 遍历矩阵a和b,并让元素相乘
for (int i = 0;i<resultMat.getRowNum();i++){
for (int j = 0; j<resultMat.getColNum();j++){
BigDecimal value = new BigDecimal(0.0);
// 计算矩阵resultMat第i行第j列元素
for (int c = 0;c <a.getColNum();c++){
value = value.add(a.getValue(i,c).multiply(b.getValue(c,j)));
// 将结果存为resultMat的第i行第j列元素
resultMat.setValue(i,j,value);
}
}
}
return resultMat;
}
// 4、矩阵点乘
public final static Matrix dot(Matrix a,Matrix b){
// a,b矩阵若为空则直接返回, 保证a,b具有相同的列数
if(a == null || b == null||a.getRowNum() != b.getRowNum() || a.getColNum()!=b.getColNum()){
return null;
}
// 创建新矩阵resultMat,用于保存相加的结果
Matrix resultMat = new Matrix(a.getRowNum(), a.getColNum());
// 遍历矩阵a和b,并让元素相加
for (int i = 0;i<resultMat.getRowNum();i++){
for (int j = 0; j<resultMat.getColNum();j++){
BigDecimal value = a.getValue(i,j).multiply(b.getValue(i,j));
resultMat.setValue(i,j,value);
}
}
return resultMat;
}
//5、矩阵转置
public final static Matrix transpose(Matrix mat){
// a,b矩阵若为空则直接返回, 保证a,b具有相同的列数
if(mat == null){
return null;
}
// 创建新矩阵transposeMat,用于保存转置后的结果
Matrix transposeMat = new Matrix(mat.getColNum(),mat.getRowNum());
// 遍历矩阵mat,开始转置操作
for (int i = 0; i <mat.getRowNum();i++){
for (int j = 0 ;j< mat.getColNum();j++){
BigDecimal value = mat.getValue(i,j);
transposeMat.setValue(j,i,value);
}
}
return transposeMat;
}
// 6、生成单位矩阵
public final static Matrix identityMatrix(int dimension){
// 创建一个拥有维度为dimension的方阵identityMatrix
Matrix identityMatrix = new Matrix(dimension, dimension);
// 将矩阵identityMatrix的对角线元素设置为1
for (int i = 0;i <identityMatrix.getRowNum();i++){
identityMatrix.setValue(i,i,1.0);
}
return identityMatrix;
}
// 7、矩阵的复制
public final static Matrix copy(Matrix x){
// 创建一个行数、列数都和矩阵x一样的矩阵copiedMat
Matrix copiedMat = new Matrix(x.getRowNum(), x.getColNum());
// 遍历矩阵x,将元素复制到copiedMat中
for (int i = 0; i <x.getRowNum();i++){
for (int j = 0;j<x.getColNum();j++){
BigDecimal value = x.getValue(i,j);
copiedMat.setValue(i,j,value);
}
}
return copiedMat;
}
// 8、矩阵合并
public final static Matrix MergeMatrix(Matrix x1,Matrix x2,int direction){
if(direction == 0){
// 创建矩阵mergedMat,作为合并后新矩阵
Matrix mergedMat = new Matrix(x1.getRowNum() + x2.getRowNum(), x1.getColNum());
// 从x1中复制数据到mergedMat
for (int r = 0; r< x1.getRowNum();r++){
for (int c = 0;c <x1.getColNum();c++){
BigDecimal value = x1.getValue(r,c);
mergedMat.setValue(r,c,value);
}
}
// 从x2中复制数据到mergedMat
for (int r = 0; r< x2.getRowNum();r++){
for (int c = 0;c <x2.getColNum();c++){
BigDecimal value = x2.getValue(r,c);
mergedMat.setValue(r+x1.getRowNum(),c,value);
}
}
return mergedMat;
}
else if(direction == 1){
// 创建矩阵mergedMat,作为合并后新矩阵
Matrix mergedMat = new Matrix(x1.getRowNum(), x1.getColNum()+x2.getColNum());
// 从x1中复制数据到mergedMat
for (int r = 0; r< x1.getRowNum();r++){
for (int c = 0;c <x1.getColNum();c++){
BigDecimal value = x1.getValue(r,c);
mergedMat.setValue(r,c,value);
}
}
// 从x2中复制数据到mergedMat
for (int r = 0; r< x2.getRowNum();r++){
for (int c = 0;c <x2.getColNum();c++){
BigDecimal value = x2.getValue(r,c);
mergedMat.setValue(r,c + x1.getColNum(),value);
}
}
return mergedMat;
}
else {
return null;
}
}
}
2、python
import numpy as np
# 矩阵加法
def test_add(a,b):
c = np.add(a,b)
print(c)
# 矩阵减法
def test_sub(a,b):
c = np.subtract(a,b)
print(c)
def test_dot(a,b):
# np.multiply点乘
c = np.multiply(a,b)
print(c)
def test_mul(a,b):
# np.dot矩阵相乘
c = np.dot(a,b)
print(c)
# 矩阵转置
def test_transpose(a):
# 转置
c = np.transpose(a)
print(c)
# 创建单位矩阵
def test_identity_mat(n):
c = np.identity(n)
print(c)
# 矩阵复制
def test_copy_mat(a):
c = np.copy(a)
print(c)
# 矩阵合并
def test_merge_mat(a,b):
# np.concatenate实现矩阵合并,参数0和1表示不同的合并方式
c1 = np.concatenate([a,b],0)
c2 = np.concatenate([a,b],1)
print(c1)
print(c2)
if __name__ == "__main__":
a = np.array([[1,2],[3,4]])
b = np.array([[1,1],[1,1]])
test_add(a,b)
test_sub(a,b)
test_dot(a,b)
test_mul(a,b)
test_transpose(a)
test_identity_mat(5)
test_copy_mat(a)
test_merge_mat(a,b)