1 package org.djunits.value.vdouble.matrix.base;
2
3 import org.djunits.unit.SIUnit;
4 import org.djunits.unit.Unit;
5 import org.djunits.unit.util.UnitException;
6 import org.djunits.value.Relative;
7 import org.djunits.value.ValueRuntimeException;
8 import org.djunits.value.base.Matrix;
9 import org.djunits.value.vdouble.function.DoubleMathFunctions;
10 import org.djunits.value.vdouble.matrix.SIMatrix;
11 import org.djunits.value.vdouble.matrix.data.DoubleMatrixData;
12 import org.djunits.value.vdouble.scalar.base.AbstractDoubleScalar;
13 import org.djunits.value.vdouble.scalar.base.AbstractDoubleScalarRel;
14 import org.djunits.value.vdouble.vector.base.AbstractDoubleVector;
15 import org.djunits.value.vdouble.vector.base.AbstractDoubleVectorRel;
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public abstract class AbstractDoubleMatrixRel<U extends Unit<U>, S extends AbstractDoubleScalarRel<U, S>,
30 RV extends AbstractDoubleVectorRel<U, S, RV>, RM extends AbstractDoubleMatrixRel<U, S, RV, RM>>
31 extends AbstractDoubleMatrix<U, S, RV, RM> implements Matrix.Rel<U, S, RV, RM>, Relative<U, RM>
32 {
33
34 private static final long serialVersionUID = 20190908L;
35
36
37
38
39
40
41 protected AbstractDoubleMatrixRel(final DoubleMatrixData data, final U unit)
42 {
43 super(data.copy(), unit);
44 }
45
46
47
48
49
50 public final S zSum()
51 {
52 return instantiateScalarSI(this.data.zSum(), getDisplayUnit());
53 }
54
55
56 @Override
57 public final RM plus(final RM rel) throws ValueRuntimeException
58 {
59 return instantiateMatrix(this.getData().plus(rel.getData()), getDisplayUnit());
60 }
61
62
63 @Override
64 public final RM minus(final RM rel) throws ValueRuntimeException
65 {
66 return instantiateMatrix(this.getData().minus(rel.getData()), getDisplayUnit());
67 }
68
69
70
71
72
73
74
75 @SuppressWarnings("unchecked")
76 public RM incrementBy(final S increment)
77 {
78 checkCopyOnWrite();
79 assign(DoubleMathFunctions.INC(increment.si));
80 return (RM) this;
81 }
82
83
84
85
86
87
88
89
90
91 @SuppressWarnings("unchecked")
92 public RM incrementBy(final RM increment)
93 {
94 checkCopyOnWrite();
95 this.data.incrementBy(increment.getData());
96 return (RM) this;
97 }
98
99
100
101
102
103
104
105 @SuppressWarnings("unchecked")
106 public RM decrementBy(final S decrement)
107 {
108 checkCopyOnWrite();
109 assign(DoubleMathFunctions.DEC(decrement.si));
110 return (RM) this;
111 }
112
113
114
115
116
117
118
119
120
121 @SuppressWarnings("unchecked")
122 public final RM decrementBy(final RM decrement)
123 {
124 checkCopyOnWrite();
125 this.data.decrementBy(decrement.getData());
126 return (RM) this;
127 }
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142 public final <UT extends Unit<UT>, ST extends AbstractDoubleScalar<UT, ST>, VT extends AbstractDoubleVector<UT, ST, VT>,
143 MT extends AbstractDoubleMatrix<UT, ST, VT, MT> & Relative<UT, MT>> SIMatrix times(final MT rel)
144 throws ValueRuntimeException, UnitException
145 {
146 return new SIMatrix(this.getData().times(rel.getData()), SIUnit.of(
147 getDisplayUnit().getQuantity().getSiDimensions().plus(rel.getDisplayUnit().getQuantity().getSiDimensions())));
148 }
149
150
151 @Override
152 public final RM times(final double multiplier)
153 {
154 RM result = clone().mutable();
155 result.assign(DoubleMathFunctions.MULT(multiplier));
156 return result.immutable();
157 }
158
159
160 @Override
161 public final RM times(final float multiplier)
162 {
163 return times((double) multiplier);
164 }
165
166
167 @Override
168 public final RM multiplyBy(final double multiplier)
169 {
170 return assign(DoubleMathFunctions.MULT(multiplier));
171 }
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186 public final <UT extends Unit<UT>, ST extends AbstractDoubleScalar<UT, ST>, VT extends AbstractDoubleVector<UT, ST, VT>,
187 MT extends AbstractDoubleMatrix<UT, ST, VT, MT> & Relative<UT, MT>> SIMatrix divide(final MT rel)
188 throws ValueRuntimeException, UnitException
189 {
190 return new SIMatrix(this.getData().divide(rel.getData()), SIUnit.of(
191 getDisplayUnit().getQuantity().getSiDimensions().minus(rel.getDisplayUnit().getQuantity().getSiDimensions())));
192 }
193
194
195 @Override
196 public final RM divide(final float divisor)
197 {
198 return divide((double) divisor);
199 }
200
201
202 @Override
203 public final RM divide(final double divisor)
204 {
205 RM result = clone().mutable();
206 result.assign(DoubleMathFunctions.DIV(divisor));
207 return result.immutable();
208 }
209
210
211 @Override
212 public final RM divideBy(final double divisor)
213 {
214 return assign(DoubleMathFunctions.DIV(divisor));
215 }
216
217 }