1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
package com.wcohen.ss.abbvGapsHmm;
/**
* M-by-N-by-K matrix implementation.
*/
final public class Matrix3D {
private final int M; // dim1
private final int N; // dim2
private final int K; // dim3
private final double[][][] data; // M-by-N-by-K array
// create M-by-N matrix of 0's
public Matrix3D(int M, int N, int K) {
this.M = M;
this.N = N;
this.K = K;
data = new double[M][N][K];
}
// create matrix based on 3d array
public Matrix3D(double[][][] data) {
M = data.length;
N = data[0].length;
K = data[0][0].length;
this.data = new double[M][N][K];
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
for (int l = 0; l < K; l++)
this.data[i][j][l] = data[i][j][l];
}
// copy constructor
private Matrix3D(Matrix3D A) { this(A.data); }
// create and return a random M-by-N matrix with values between 0 and 1
public static Matrix3D random(int M, int N, int K) {
Matrix3D A = new Matrix3D(M, N, K);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
for (int l = 0; l < K; l++)
A.data[i][j][l] = Math.random();
return A;
}
// create and return the N-by-N identity matrix
public static Matrix3D identity(int N) {
Matrix3D I = new Matrix3D(N, N, N);
for (int i = 0; i < N; i++)
I.data[i][i][i] = 1;
return I;
}
// return C = A + B
public Matrix3D plus(Matrix3D B) {
Matrix3D A = this;
if (B.M != A.M || B.N != A.N || B.K != A.K) throw new RuntimeException("Illegal matrix dimensions.");
Matrix3D C = new Matrix3D(M, N, K);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
for (int l = 0; l < K; l++)
C.data[i][j][l] = A.data[i][j][l] + B.data[i][j][l];
return C;
}
// return C = A - B
public Matrix3D minus(Matrix3D B) {
Matrix3D A = this;
if (B.M != A.M || B.N != A.N || B.K != A.K) throw new RuntimeException("Illegal matrix dimensions.");
Matrix3D C = new Matrix3D(M, N, K);
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
for (int l = 0; l < K; l++)
C.data[i][j][l] = A.data[i][j][l] - B.data[i][j][l];
return C;
}
// does A = B exactly?
public boolean eq(Matrix3D B) {
Matrix3D A = this;
if (B.M != A.M || B.N != A.N || B.K != A.K) throw new RuntimeException("Illegal matrix dimensions.");
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
for (int l = 0; l < K; l++)
if (A.data[i][j][l] != B.data[i][j][l]) return false;
return true;
}
// return C = A * s
public Matrix3D times(double s) {
Matrix3D A = this;
Matrix3D C = new Matrix3D(A);
for (int i = 0; i < C.M; i++)
for (int j = 0; j < C.N; j++)
for (int l = 0; l < C.K; l++)
C.data[i][j][l] *= s;
return C;
}
// return an entry in the matrix
public double at(int i, int j, int l){
return data[i][j][l];
}
public void set(int i, int j, int l, double val){
data[i][j][l] = val;
}
public void add(int i, int j, int l, double val){
data[i][j][l] += val;
}
public void mul(int i, int j, int l, double val){
data[i][j][l] *= val;
}
public int dimension1(){
return M;
}
public int dimension2(){
return N;
}
public int dimension3(){
return K;
}
}
|