我正在開發名爲Lights Out的遊戲。所以爲了解決這個問題,我必須在模塊2中計算出AX = B的答案。所以,由於這個原因我選擇了jscience
庫。在這個遊戲中,A的大小是25x25矩陣,X和B都是25x1矩陣。我寫的代碼,如下:Matrix Computing太慢
AllLightOut.java
類:
public class AllLightOut {
public static final int SIZE = 5;
public static double[] Action(int i, int j) {
double[] change = new double[SIZE * SIZE];
int count = 0;
for (double[] d : Switch(new double[SIZE][SIZE], i, j))
for (double e : d)
change[count++] = e;
return change;
}
public static double[][] MatrixA() {
double[][] mat = new double[SIZE * SIZE][SIZE * SIZE];
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
mat[i * SIZE + j] = Action(i, j);
return mat;
}
public static SparseVector<ModuloInteger> ArrayToDenseVectorModule2(
double[] array) {
List<ModuloInteger> list = new ArrayList<ModuloInteger>();
for (int i = 0; i < array.length; i++) {
if (array[i] == 0)
list.add(ModuloInteger.ZERO);
else
list.add(ModuloInteger.ONE);
}
return SparseVector.valueOf(DenseVector.valueOf(list),
ModuloInteger.ZERO);
}
public static SparseMatrix<ModuloInteger> MatrixAModule2() {
double[][] mat = MatrixA();
List<DenseVector<ModuloInteger>> list = new ArrayList<DenseVector<ModuloInteger>>();
for (int i = 0; i < mat.length; i++) {
List<ModuloInteger> l = new ArrayList<ModuloInteger>();
for (int j = 0; j < mat[i].length; j++) {
if (mat[i][j] == 0)
l.add(ModuloInteger.ZERO);
else
l.add(ModuloInteger.ONE);
}
list.add(DenseVector.valueOf(l));
}
return SparseMatrix.valueOf(DenseMatrix.valueOf(list),
ModuloInteger.ZERO);
}
public static double[][] Switch(double[][] action, int i, int j) {
action[i][j] = action[i][j] == 1 ? 0 : 1;
if (i > 0)
action[i - 1][j] = action[i - 1][j] == 1 ? 0 : 1;
if (i < action.length - 1)
action[i + 1][j] = action[i + 1][j] == 1 ? 0 : 1;
if (j > 0)
action[i][j - 1] = action[i][j - 1] == 1 ? 0 : 1;
if (j < action.length - 1)
action[i][j + 1] = action[i][j + 1] == 1 ? 0 : 1;
return action;
}
}
和主類是如下:
public class Main {
public static void main(String[] args) {
double[] bVec = new double[] { 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0 };
SparseMatrix<ModuloInteger> matA = AllLightOut.MatrixAModule2();
SparseVector<ModuloInteger> matB = AllLightOut
.ArrayToDenseVectorModule2(bVec);
ModuloInteger.setModulus(LargeInteger.valueOf(2));
Vector<ModuloInteger> matX = matA.solve(matB);
System.out.println(matX);
}
}
我跑這個節目約30分鐘,但它不會導致。我的代碼是否包含致命錯誤或錯誤?爲什麼需要太長時間?
感謝您的關注:)
編輯 放緩在這條線Matrix<ModuloInteger> matX = matA.inverse();
發生。請注意,這個庫的速度非常高,但我不知道爲什麼我的程序運行速度太慢!
EDIT2 請注意,當我嘗試SIZE = 3
,我真的得到答案。例如: MATA:
{{1, 1, 0, 1, 0, 0, 0, 0, 0}, {1, 1, 1, 0, 1, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 1, 0, 0, 0}, {1, 0, 0, 1, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 1, 1, 0, 1, 0}, {0, 0, 1, 0, 1, 1, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 1, 0, 1, 1, 1}, {0, 0, 0, 0, 0, 1, 0, 1, 1}}
MATB:
{1,1,1,1,1,1,1,0,0}
MatC:
{0,0,1,1,0,0,0,0,0}
但是,當我嘗試SIZE = 5
,發生放緩。
你能告訴我們哪裏的放緩是怎麼回事?如果你沒有分析器,我會嘗試從底部開始註釋。這應該需要很快的時間才能完成 – dfb 2012-07-18 23:02:51
@dfb請參閱編輯:) – 2012-07-18 23:22:17