package classification;
import java.text.DecimalFormat;
import com.sun.org.apache.regexp.internal.recompile;
import Jama.Matrix;
//矩阵操作类,包含对矩阵的各种操作
public class MOs {
///// 全零矩阵
public static double[][] zeros(int m, int n) {
double[][] x = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[i][j] = 0;
return x;
}
//////// 全1矩阵
public static double[][] ones(int m, int n) {
double[][] x = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[i][j] = 1;
return x;
}
// 矩阵+矩阵
public static double[][] mPlus(double a[][], double b[][]) {
int m1 = a.length, m2 = b.length;
int n1 = a[0].length, n2 = b[0].length;
double[][] mpm = new double[m1][n1];
if (m1 != m2 || n1 != n2)
System.out.println("mPius出错:矩阵不匹配!");
else
for (int i = 0; i < m1; i++)
for (int j = 0; j < n1; j++)
mpm[i][j] = a[i][j] + b[i][j];
return mpm;
}
// 矩阵+数值
public static double[][] mPlus(double a[][], double b) {
int m = a.length;
int n = a[0].length;
double[][] c = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = a[i][j] + b;
return c;
}
// 矩阵-矩阵
public static double[][] mMinus(double a[][], double b[][]) {
int m1 = a.length, m2 = b.length;
int n1 = a[0].length, n2 = b[0].length;
double[][] mMm = new double[m1][n1];
if (m1 != m2 || n1 != n2)
System.out.println("mMinus出错:矩阵不匹配!");
else
for (int i = 0; i < m1; i++)
for (int j = 0; j < n1; j++)
mMm[i][j] = a[i][j] - b[i][j];
return mMm;
}
// 数值-矩阵
public static double[][] mMinus(double b, double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] c = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = b - a[i][j];
return c;
}
/////// 矩阵*数值
public static double[][] mMulti(double a[][], double b) {
int m = a.length;
int n = a[0].length;
double[][] c = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = a[i][j] * b;
return c;
}
//// 矩阵*矩阵
public static double[][] mMulti(double a[][], double b[][]) {
int m1 = a.length, m2 = b.length;
int n1 = a[0].length, n2 = b[0].length;
double[][] mmm = new double[m1][n2];
if (n1 != m2)
System.out.println("mMuti出错:矩阵不匹配!");
else
for (int i = 0; i < m1; i++)
for (int k = 0; k < n2; k++) {
mmm[i][k] = 0;
for (int j = 0; j < n1; j++)
mmm[i][k] += a[i][j] * b[j][k];
}
return mmm;
}
///// 矩阵对应乘-点乘
public static void dotProduct() {
}
///// 矩阵各元素幂次方
public static double[][] pow(double a[][], double b) {
int m = a.length;
int n = a[0].length;
double[][] x = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[i][j] = Math.pow(a[i][j], b);
return x;
}
////// e的指数
public static double[][] e(double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] x = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[i][j] = Math.exp(a[i][j]);
return x;
}
///// 对数以e为底
public static double[][] log(double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] x = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[i][j] = Math.log(a[i][j]);
return x;
}
//// 矩阵转置
public static double[][] transpose(double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] x = new double[n][m];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
x[j][i] = a[i][j];
return x;
}
///// 对矩阵求和
public static double sum(double a[][]) {
int m = a.length;
int n = a[0].length;
double sum = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
sum += a[i][j];
return sum;
}
///// 对矩阵行、列求和
public static double[][] sum(double a[][], int b) {
int m = a.length;
int n = a[0].length;
if (b == 1) {// 对行求和
double[][] sum = new double[m][1];
for (int i = 0; i < m; i++) {
sum[i][0] = 0;
for (int j = 0; j < n; j++)
sum[i][0] = sum[i][0] + a[i][j];
}
return sum;
} else if (b == 2) {// 对列求和
double[][] sum = new double[1][n];
for (int i = 0; i < n; i++) {
sum[0][i] = 0;
for (int j = 0; j < m; j++)
sum[0][i] = sum[0][i] + a[j][i];
}
return sum;
}
return new double[][] {};
}
/// 矩阵行连接
public static double[][] rowCombination(double a[][], double b[][]) {
int m1 = a.length;
int n1 = a[0].length;
int m2 = b.length;
int n2 = b[0].length;
double[][] rowCombination = new double[m1][n1 + n2];
if (m1 != m2)
System.out.println("rowCombination出错:矩阵行数不匹配!");
else {
for (int j = 0; j < n1; j++)// 一列一列地存入
for (int i = 0; i < m1; i++)
rowCombination[i][j] = a[i][j];
for (int j = n1, k = 0; j < n1 + n2; j++, k++)
for (int i = 0; i < m1; i++)
rowCombination[i][j] = b[i][k];
}
return rowCombination;
}
/// 矩阵列连接
public static double[][] colCombination(double a[][], double b[][]) {
int m1 = a.length;
int n1 = a[0].length;
int m2 = b.length;
int n2 = b[0].length;
double[][] colCombination = new double[m1 + m2][n1];
if (n1 != n2)
System.out.println("colCombination出错:矩阵列数不匹配!");
else {
for (int i = 0; i < m1; i++)
for (int j = 0; j < n1; j++)
colCombination[i][j] = a[i][j];
for (int i = 0, j = m1; i < m2; i++, j++)
for (int k = 0; k < n2; k++)
colCombination[j][k] = b[i][k];
}
return colCombination;
}
/////// 被一除
public static double[][] dividedByOne(double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] c = new double[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
c[i][j] = 1 / a[i][j];
return c;
}
//// 获取子矩阵,行为m1:m2,列为n1:n2
public static double[][] getMatrix(double a[][], int m1, int m2, int n1, int n2) {
double[][] x = new double[m2 - m1 + 1][n2 - n1 + 1];
for (int i = 0; i < m2 - m1 + 1; i++)
for (int j = 0; j < n2 - n1 + 1; j++)
x[i][j] = a[m1 - 1 + i][n1 - 1 + j];
return x;
}
//// 输出矩阵
public static void putMatrix(double a[][]) {
int m = a.length;
int n = a[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
System.out.print(a[i][j] + " ");
System.out.println();
}
}
///// 对矩阵元素统一形式-此处小数点后保留三位(四舍五入)
public static double[][] mFormat(double a[][]) {
int m = a.length;
int n = a[0].length;
DecimalFormat format = new DecimalFormat("0.000");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
String result = format.format(a[i][j]);
a[i][j] = Double.parseDouble(result);
}
}
return a;
}
////// 计算两个矩阵间相同元素的个数
public static int numSame(double a[][], double b[][]) {
int num = 0;
int m1 = a.length, m2 = b.length;
int n1 = a[0].length, n2 = b[0].length;
if (m1 != m2 || n1 != n2)
System.out.println("numSame出错:矩阵不匹配");
else
for (int i = 0; i < m1; i++)
for (int j = 0; j < n1; j++)
if (a[i][j] == b[i][j])
num++;
return num;
}
//// 计算一个矩阵中含有某个数的个数
public static int numSame(double a[][], int x) {
int num = 0;
int m1 = a.length;
int n1 = a[0].length;
for (int i = 0; i < m1; i++)
for (int j = 0; j < n1; j++)
if (a[i][j] == x)
num++;
return num;
}
///// 寻找矩阵每行中最大元素的索引(返回实际的序数,即以1开始)
public static double[][] indexMax(double a[][]) {
int m = a.length;
int n = a[0].length;
double[][] index = new double[m][1];