import org.ujmp.core.Matrix; //导入方法依赖的package包/类
/**
* 用于生成矩阵p1
*
* @param p0
*/
public static Matrix CreateMatrixP1(Matrix p0) {
System.out.println("正在构建矩阵P1...");
long[] p0_size = p0.getSize();
long n = p0_size[1];
Matrix p1 = Matrix.Factory.zeros(n, n);
Matrix pai = Matrix.Factory.zeros(n, n);
for (int order = 0; order < n; order++) {
Matrix s = Matrix.Factory.zeros(1, n);
Matrix d = Matrix.Factory.zeros(1, n);
Matrix p = Matrix.Factory.zeros(1, n);
for (int i = 0; i < n; i++) {
d.setAsDouble(p0.getAsDouble(order, i), 0, i);
if (p0.getAsDouble(order, i) == 0)
p.setAsInt(-1, 0, i);
else
p.setAsInt(order, 0, i);
}
s.setAsInt(1, 0, order);
for (int i = 0; i < n; i++) {
double temp = 0.0;
int t = 0;
for (int j = 0; j < n; j++) {
if (s.getAsInt(0, j) == 0 && d.getAsDouble(0, j) > temp) {
t = j;
temp = d.getAsDouble(0, j);
}
}
s.setAsInt(1, 0, t);
if (s.getMinValue() == 1) break;
for (int j = 0; j < n; j++) {
if (s.getAsInt(0, j) == 0 && p0.getAsDouble(t, j) > 0) {
if (d.getAsDouble(0, j) < d.getAsDouble(0, t) * p0.getAsDouble(t, j)) {
d.setAsDouble(d.getAsDouble(0, t) * p0.getAsDouble(t, j), 0, j);
p.setAsInt(t, 0, j);
}
}
}
}
for (int i = 0; i < n; i++) {
p1.setAsDouble(d.getAsDouble(0, i), order, i);
pai.setAsInt(p.getAsInt(0, i), order, i);
}
}
// printMatrix(p1, oriPath + "experiment\\p1.txt");
return p1;
}