2017-06-17 2 views
1

私は、Java 8でマトリックスの行列式を見つける方法をコード化しようとしています。そのような場合にはいくつかの特殊なケースがあります。例えば、行列が上三角形である場合。私はこのコードを使ってPython 3.6で、この作品をコード化:pythonからJavaへのすべてのものと任意のものの代替?

def is_upper_triangular(a, order): 
    for i in range(1, order): 
     if all(a[i][j] == 0 for j in range(order)): 
      return True 
    return False 

これは非常に簡単かつクリーンなコードですので、私は、Javaでコーディングすると思ってきましたが、私はするためにJavaで任意の「すべて」の方法を見つけることができません。これを使って。私は、このWebページのそれに関するいくつかの情報を否定的な解決策で見つけました。私の問題を解決するための選択肢はありますか?ここで 今の私のJavaコードがあります:

public static double detMatrix(double[][] matriz) { 
     if(matriz.length == 1) 
      return matriz[0][0]; 
     if(matriz.length == 2) 
      return matriz[0][0] * matriz[1][1] - matriz[1][0] * matriz[0][1]; 
     double det = 0; 
     for(int i=0; i<matriz.length; i++){ 
      double[][] nm = new double[matriz.length-1][matriz.length-1]; 
      for(int j=0; j<matriz.length; j++){ 
       if(j != i){ 
        for(int k=1; k<matriz.length; k++){ 
        int indice = -1; 
        if(j<i) 
        indice = j; 
        else if(j>i) 
        indice = j - 1; 
        nm[indice][k-1] = matriz[j][k]; 
        } 
       } 
      } 
      if(i % 2 == 0) 
       det += matriz[i][0] * detMatrix(nm); 
      else 
       det -= matriz[i][0] * detMatrix(nm); 
     } 
     return det; 
    } 

おかげ

+0

pythonとjavaの両方のソリューションは、2次の時間の複雑さを持ちます。 –

答えて

1

私はあなたがJavaで特定のキーワードの機能を求めている知っているが、異なるプログラミング言語は異なるアプローチを与えます。

たとえば、all演算子の代わりに、単にArrays.fill(...)を使用するのはなぜですか?

for i in range(1, order): 
    if all(a[i][j] == 0 for j in range(order)) 

のように見えるのpythonは、同様に

for (int i = 0; i < a.length, i++) { 
    Arrays.fill(a[i], i+1, a[i].length, 0); 
} 

ようになり、それはより少ないリソースでやっているようにPythonでany操作が見えるかもしれませんが、実際にそれが

for (Element element : allElements() { 
    if (element satisifies condition) { 
     ... statements ... 
    } 
} 
まで崩壊します

Javaの場合、上記のループは機能しますが、非効率性が顕著になります。あなたのコードが何をしているのか本当に気に入らない場合は、メソッド内でこれを隠すことができます。

public List<int> findFives(int[][] a) { 
     ... 
} 
+0

これはストリームで行うこともできますが、ストリームの背後にある考え方は要素を個別に処理することです。この場合、値は2次元配列内の位置に依存するため、ストリーム処理では各要素を(value、x、y)の三つ組に崩壊させなければならず、メモリオーバヘッドが大きくなります。 –

+0

私は行列の中の数を置き換えたいとは思っていません。あらかじめ定義された行列のすべてのゼロを探したいのですが – Tobal

0

まあ、Javaがストリームで動作するようだが、ストリームbeauseハードオプションがあり、それはそう、それはアレイ1D内の任意の行列を変換し、私はメインの下にあるすべての0年代を検索したいとき、これは非常に困難です対角行列。私はいくつかの人々がそれを解決するために知っていると思うが、私はそれについて知らない。 その他の問題は、いくつかのJavaパッケージをロードする必要があることです。だから私は余分なJavaパッケージをロードすることなく別のソリューションを見つけました。ここにあります:

public static double [][] transMatrix(double [][] mat) { 
     double[][] matrizT = new double[mat[0].length][mat.length]; 
     for(int i=0; i<mat.length; i++) 
      for (int j = 0; j<mat[i].length; j++) 
       matrizT[j][i] = mat[i][j]; 

     return matrizT; 
    } 
    public static boolean isUpper(double[][] mat) { 
     int p = 0; 
     for(int i=0;i<mat.length;i++) 
     { 
      for(int j=0;j<i;j++) 
      { 
       if(mat[i][j]!=0) 
        p = 1; break; 
      } 
     } 
     return p == 0; 
    } 
    public static double productDiag(double[][] mat) { 
     double prod; 
     prod = 1.; 
     for(int i=0;i<mat.length;i++) 
      for(int j=0; j<mat[0].length;j++) 
       if(i==j) 
        prod *= mat[i][j]; 

     return prod; 
    } 
    public static double detMatrix(double[][] matrix) { 
     if(matrix.length == 1) 
      return matrix[0][0]; 
     if(matrix.length == 2) 
      return matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]; 
     if(isUpper(matrix) || isUpper(transMatrix(matrix)) 
      || (isUpper(matrix) && isUpper(transMatrix(matrix)))){ 
      return productDiag(matrix); 
     } 
     double det = 0; 
     for(int i=0; i<matrix.length; i++){ 
      double[][] minor = new double[matrix.length-1][matrix.length-1]; 
      for(int j=0; j<matrix.length; j++){ 
       if(j != i){ 
        for(int k=1; k<matrix.length; k++){ 
        int index = -1; 
        if(j<i) 
        index = j; 
        else if(j>i) 
        index = j - 1; 
        minor[index][k-1] = matrix[j][k]; 
        } 
       } 
      } 
      if(i % 2 == 0) 
       det += matrix[i][0] * detMatrix(minor); 
      else 
       det -= matrix[i][0] * detMatrix(minor); 
     } 
     return det; 
    } 

ありがとうございました。

関連する問題