一个n * n的矩阵,如果每个元素都是正数,并且每列的元素的和为1,则成为正马尔可夫矩阵。编写下面的方法来检测矩阵是否是马尔可夫矩阵:
public static boolean isMarkovMatrix(double[][] m)
编写一个测试程序,提示用户数输入一个3*3的double值的矩阵,测试它是否是马尔可夫矩阵。
测试数据:
0.15 0.875 0.375
0.55 0.005 0.225
0.30 0.12 0.4
0.95 -0.875 0.375
0.65 0.005 0.225
0.30 0.22 -0.4
package pack2;
import java.util.Scanner;
public class MarkovMatrix {
public static void main(String[] args) {
markovMatrix();
}
public static void markovMatrix() {
try(Scanner input = new Scanner(System.in);) {
System.out.print("Enter the length of a matrix: ");
int length = input.nextInt();
double[][] m = new double[length][length];
System.out.println("Enter a " + length + "-by-" + length +
" matrix row by row: ");
inputData(input, m);
System.out.println("It is " + (isMarkovMatrix(m) ? "" : "not ") +
"a Markov matrix");
}
}
/**接受数据输入*/
public static void inputData(Scanner input, double[][] m) {
for (int i = 0; i < m.length; i++)
for (int j = 0; j < m[i].length; j++)
m[i][j] = input.nextDouble();
}
/**是否为正马尔科夫矩阵?*/
public static boolean isMarkovMatrix(double[][] m) {
double columnSum; //列和
for (int i = 0; i < m.length; i++) {
columnSum = 0; //每列先置0
for (int j = 0; j < m.length; j++) {
if(m[j][i] < 0) return false; //存在负数时,返回false
columnSum += m[j][i];
}
if(!(Math.abs(columnSum - 1) < 0.00001)) //列和不等于1时,返回false
return false;
}
return true;
}
}