2012-10-31 4 views
-1

안녕하세요 자마 도서관이 있습니다.하지만이 도서관은 Double numbers ...와 매우 느립니다. 안드로이드 애플 리케이션을위한 .. 그리고 마침내 내가 eomp decomp의 너무 높은 정밀도가 필요 없어요 .. 그래서 JAVA와 구문에서 플로트 num .....와 일부 JAVA libaray 무엇입니까? becouse ... 나는 다시는 440 행의 코드를 다시 써야겠다. 가. 조인, 역행, 그래서 기본 선형 대수 연산 ..Java 라이브러리 eigenvalues ​​float numbers

또는 동일한 자바 라이브러리 고유 값이 존재합니다. 스레드가 있습니까?

+0

조롱 받고 싶지 않도록 코드를 게시하십시오. 아니요, 심각하게 코드를 게시하고 질문을 작성하십시오. – Shark

+0

float 계산이 이중 계산보다 빠르다고 생각하는 이유는 무엇입니까? 두 번째 질문은 이해하기 어렵습니다. – assylias

+0

내가 이전에 계산 한 몇 가지 방법 마녀가 float에 있기 때문에 ... double에서 float을 double로 변환하거나 정밀도를 플로팅하기 위해 다른 방법을 다시 쓸 수 있도록 두 번째 시간이 너무 오래 걸립니다. –

답변

0

아니면 다음과 같은 것을 찾으십니까?

 import java.util.Arrays; 

public class Matrix { 

protected int rows; 

protected int cols; 

double[][] values; 

public Matrix(int rows, int cols) { 
    this.rows = rows; 
    this.cols = cols; 

    values = new double[rows][cols]; 

    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      values[i][j] = 0; 

} 

public Matrix(int[][] M) { 
    this.rows = M.length; 
    this.cols = M[0].length; 

    values = new double[rows][cols]; 

    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      values[i][j] = M[i][j]; 
} 

public Matrix(double[][] M) { 
    this.rows = M.length; 
    this.cols = M[0].length; 

    values = new double[rows][cols]; 

    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      values[i][j] = M[i][j]; 
} 

public void setToEye() { 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      values[i][j] = (i == j) ? 1 : 0; 

} 

public static int[] matrixSize(Matrix M) { 
    int[] size = new int[2]; 
    size[0] = M.rows; 
    size[1] = M.cols; 
    return size; 
} 

public static double vectMul(double[] A, double[] B) { 
    double suma = 0; 
    for (int i = 0; i < A.length; i++) 
     suma += A[i] * B[i]; 

    return suma; 
} 

public static Matrix matrixTranspose(Matrix M) { 
    int[] size = matrixSize(M); 
    double[][] Mt = new double[size[0]][size[1]]; 

    for (int i = 0; i < size[0]; i++) 
     for (int j = 0; j < size[1]; j++) 
      Mt[i][j] = M.getValue(j, i); 

    return new Matrix(Mt); 
} 

public static Matrix matrixMul(Matrix A, Matrix B) { 
    int m1 = matrixSize(A)[0]; 
    int n1 = matrixSize(A)[1]; 
    int m2 = matrixSize(B)[0]; 
    int n2 = matrixSize(B)[1]; 
    double[][] rez; 

    if (n1 != m2) { 
     System.err.println("Inner matrix dimensions must agree!"); 
     return null; 
    } 

    rez = new double[m1][n2]; 
    for (int i = 0; i < m1; i++) 
     for (int j = 0; j < n2; j++) 
      rez[i][j] = vectMul(A.getRow(i), B.getColumn(j)); 

    Matrix r = new Matrix(rez); 
    return r; 
} 

public static Matrix matrixMulWithMod(Matrix A, Matrix B, double mod) { 
    int m1 = matrixSize(A)[0]; 
    int n1 = matrixSize(A)[1]; 
    int m2 = matrixSize(B)[0]; 
    int n2 = matrixSize(B)[1]; 
    double[][] rez; 

    if (n1 != m2) { 
     System.err.println("Inner matrix dimensions must agree!"); 
     return null; 
    } 

    rez = new double[m1][n2]; 
    for (int i = 0; i < m1; i++) 
     for (int j = 0; j < n2; j++) 
      rez[i][j] = vectMul(A.getRow(i), B.getColumn(j)) % mod; 

    Matrix r = new Matrix(rez); 
    return r; 
} 

public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < this.rows; i++) { 
     sb.append(Arrays.toString(values[i])); 
     sb.append('\n'); 
    } 

    String str = sb.toString(); 
    return str; 
} 

public double[][] getValues() { 
    return values; 
} 

public void setValues(double[][] values) { 
    this.values = values; 
} 

public void setValues(int[][] values) { 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      this.values[i][j] = (double) values[i][j]; 
} 

public double getValue(int row, int col) { 
    return values[row][col]; 
} 

public void setValue(int row, int col, double value) { 
    values[row][col] = value; 
} 

public double[] getRow(int row) { 
    double[] temp = new double[cols]; 
    for (int i = 0; i < temp.length; i++) 
     temp[i] = values[row][i]; 
    return temp; 

} 

public double[] getColumn(int col) { 
    double[] temp = new double[rows]; 
    for (int i = 0; i < temp.length; i++) 
     temp[i] = values[i][col]; 
    return temp; 
} 

public double[] toDoubleArray() { 
    double[] temp = new double[rows * cols]; 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      temp[i * (rows + 1) + j] = values[i][j]; 
    return temp; 
} 

public int[] toIntArray() { 
    int[] temp = new int[rows * cols]; 
    for (int i = 0; i < rows; i++) 
     for (int j = 0; j < cols; j++) 
      temp[i * (rows + 1) + j] = (int) values[i][j]; 
    return temp; 
} 

public int getRowCount() { 
    return this.rows; 
} 

public int getColumnsCount() { 
    return this.cols; 
} 

public static double getMatrixDet(Matrix M) { 
    int m = M.getRowCount(); 
    int n = M.getColumnsCount(); 

    double D = 0; 

    if (m != n) { 
     System.err.println("Matrix must be square!"); 
     System.exit(0); 
    } 

    if (n > 1) { 
     Matrix I = new Matrix(m - 1, n - 1); 

     for (int i = 1; i < m; i++) 
      for (int j = 1; j < n; j++) 
       I.setValue(i - 1, j - 1, M.getValue(i, j)); 

     D = M.getValue(0, 0) * getMatrixDet(I); 
    } else 
     D = M.getValue(0, 0); 

    // za niz , kopira iz niza a elemente 0:i-1 i+1:n sredi za matrcu 
    Matrix I = new Matrix(m - 1, n - 1); 
    for (int i = 1; i < n; i++) { 
     I = M.withoutIthRowAndJthCol(i, 0); 
     D = D + Math.pow((-1), i) * M.getValue(i, 0) * getMatrixDet(I); 
    } 
    return D; 

} 

public Matrix transpose() { 
    Matrix temp = new Matrix(this.values); 

    for (int i = 0; i < this.rows; i++) 
     for (int j = 0; j < this.cols; j++) 
      this.values[i][j] = temp.getValue(j, i); 

    return this; 
} 

private Matrix withoutIthRowAndJthCol(int row, int col) { 
    Matrix temp = new Matrix(this.rows - 1, this.cols - 1); 
    int k = 0, l = 0; 
    for (int i = 0; i < this.getRowCount(); i++) { 
     if (i == row) 
      continue; 
     for (int j = 0; j < this.getColumnsCount(); j++) { 
      if (j == col) 
       continue; 

      temp.setValue(k, l, this.values[i][j]); 
      l++; 
     } 
     l %= 2; 
     k++; 
    } 
    return temp; 
} 

public static Matrix getMatrixAdj(Matrix M) { 
    int m = M.getRowCount(); 
    int n = M.getColumnsCount(); 

    Matrix A = new Matrix(m, n); 

    if (m != n) { 
     System.err.println("Matrix must be square!"); 
     System.exit(0); 
    } 

    for (int i = 0; i < m; i++) 
     for (int j = 0; j < n; j++) { 
      A.setValue(i, j, Math.pow((-1), i + j) 
        * getMatrixDet(M.withoutIthRowAndJthCol(i, j))); 
     } 
    A.transpose(); 
    return A; 
} 

public static Matrix matrixDiv(Matrix M, double n) { 
    Matrix temp = M; 

    for (int i = 0; i < M.getRowCount(); i++) 
     for (int j = 0; j < M.getColumnsCount(); j++) 
      temp.setValue(i, j, (M.getValue(i, j)/n)); 

    return temp; 
} 

public static Matrix getMatrixInv(Matrix M) { 
    Matrix I = new Matrix(M.getRowCount(), M.getColumnsCount()); 

    if (M.getRowCount() != M.getColumnsCount()) { 
     System.err.println("Matrix must be square!"); 
     System.exit(0); 
    } 
    if (getMatrixDet(M) == 0) { 
     System.err.println("Matrix is singular!"); 
     System.exit(0); 
    } 
    I = matrixDiv(getMatrixAdj(M), getMatrixDet(M)); 
    return I; 
} 
} 

원한다면 환영합니다.

+0

이것은 어디에서 왔습니까? – arshajii

+0

내 대학 eclipse 작업 공간 폴더. 암호화와 힐의 암호화에 사용하여 실제로 사용할 수 있습니다. 내 말은, 그는 '기본 선형 대수학'이라고 말했고 이것은 역행렬을 계산할 수도 있습니다. – Shark

2

하나의 라이브러리에 la4j이라는 이름이 있습니다. 그 점을 조사해 보는 것이 좋습니다. 나는 당신이 많은 행렬 조작/계산을 할 계획이라면 Java가 좋은 선택이라고 생각하지 않는다. (나 자신이 시도하고 막 다른 골목에 섰다.) 파이썬을 조사하는 것이 더 나을지도 모른다. (NumPy) 또는 C++ (Armadillo)와 같은 프로젝트의 경우.

+0

나는 그것을 안다. 하지만 현대 수학 도구 (및 스레드) 그래서 내가 줄이면 ... 많은 작업을 사용하지만 C++ 가장 빠릅니다 알고있다. 그리고 파이썬 –