File: Matrix3D.java

package info (click to toggle)
libsecondstring-java 0.1~dfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 764 kB
  • sloc: java: 9,592; xml: 114; makefile: 6
file content (130 lines) | stat: -rw-r--r-- 3,745 bytes parent folder | download
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;
    }

}