@@ -56,6 +56,9 @@ public static DMatrixSparseCSC mult( DMatrixSparseCSC A, DMatrixSparseCSC B, @Nu
5656 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
5757 outputC = reshapeOrDeclare (outputC , A , A .numRows , B .numCols );
5858
59+ if (listWork == null )
60+ listWork = new GrowArray <>(Workspace_MT_DSCC ::new );
61+
5962 ImplMultiplication_MT_DSCC .mult (A , B , outputC , listWork );
6063
6164 return outputC ;
@@ -80,6 +83,9 @@ public static DMatrixSparseCSC add( double alpha, DMatrixSparseCSC A, double bet
8083 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
8184 outputC = reshapeOrDeclare (outputC , A , A .numRows , A .numCols );
8285
86+ if (listWork == null )
87+ listWork = new GrowArray <>(Workspace_MT_DSCC ::new );
88+
8389 ImplCommonOps_MT_DSCC .add (alpha , A , beta , B , outputC , listWork );
8490
8591 return outputC ;
@@ -93,12 +99,14 @@ public static DMatrixSparseCSC add( double alpha, DMatrixSparseCSC A, double bet
9399 * @param outputC Dense Matrix
94100 */
95101 public static DMatrixRMaj mult ( DMatrixSparseCSC A , DMatrixRMaj B , @ Nullable DMatrixRMaj outputC ,
96- @ Nullable GrowArray <DGrowArray > listWork ) {
102+ @ Nullable GrowArray <DGrowArray > workArrays ) {
97103 if (A .numCols != B .numRows )
98104 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
99105 outputC = reshapeOrDeclare (outputC , A .numRows , B .numCols );
106+ if (workArrays == null )
107+ workArrays = new GrowArray <>(DGrowArray ::new );
100108
101- ImplMultiplication_MT_DSCC .mult (A , B , outputC , listWork );
109+ ImplMultiplication_MT_DSCC .mult (A , B , outputC , workArrays );
102110
103111 return outputC ;
104112 }
@@ -107,13 +115,16 @@ public static DMatrixRMaj mult( DMatrixSparseCSC A, DMatrixRMaj B, @Nullable DMa
107115 * <p>C = C + A<sup>T</sup>*B</p>
108116 */
109117 public static void multAdd ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ,
110- @ Nullable GrowArray <DGrowArray > listWork ) {
118+ @ Nullable GrowArray <DGrowArray > workArrays ) {
111119 if (A .numCols != B .numRows )
112120 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
113121 if (A .numRows != outputC .numRows || B .numCols != outputC .numCols )
114122 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B , outputC ));
115123
116- ImplMultiplication_MT_DSCC .multAdd (A , B , outputC , listWork );
124+ if (workArrays == null )
125+ workArrays = new GrowArray <>(DGrowArray ::new );
126+
127+ ImplMultiplication_MT_DSCC .multAdd (A , B , outputC , workArrays );
117128 }
118129
119130 /**
@@ -123,27 +134,35 @@ public static void multAdd( DMatrixSparseCSC A, DMatrixRMaj B, DMatrixRMaj outpu
123134 * @param B Dense Matrix
124135 * @param outputC Dense Matrix
125136 */
126- public static DMatrixRMaj multTransA ( DMatrixSparseCSC A , DMatrixRMaj B , @ Nullable DMatrixRMaj outputC ) {
137+ public static DMatrixRMaj multTransA ( DMatrixSparseCSC A , DMatrixRMaj B , @ Nullable DMatrixRMaj outputC ,
138+ @ Nullable GrowArray <DGrowArray > workArray ) {
127139 if (A .numRows != B .numRows )
128140 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
129141
130142 outputC = reshapeOrDeclare (outputC , A .numCols , B .numCols );
131143
132- ImplMultiplication_MT_DSCC .multTransA (A , B , outputC );
144+ if (workArray == null )
145+ workArray = new GrowArray <>(DGrowArray ::new );
146+
147+ ImplMultiplication_MT_DSCC .multTransA (A , B , outputC , workArray );
133148
134149 return outputC ;
135150 }
136151
137152 /**
138153 * <p>C = C + A<sup>T</sup>*B</p>
139154 */
140- public static void multAddTransA ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ) {
155+ public static void multAddTransA ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ,
156+ @ Nullable GrowArray <DGrowArray > workArray ) {
141157 if (A .numRows != B .numRows )
142158 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
143159 if (A .numCols != outputC .numRows || B .numCols != outputC .numCols )
144160 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B , outputC ));
145161
146- ImplMultiplication_MT_DSCC .multAddTransA (A , B , outputC );
162+ if (workArray == null )
163+ workArray = new GrowArray <>(DGrowArray ::new );
164+
165+ ImplMultiplication_MT_DSCC .multAddTransA (A , B , outputC , workArray );
147166 }
148167
149168 /**
@@ -154,12 +173,15 @@ public static void multAddTransA( DMatrixSparseCSC A, DMatrixRMaj B, DMatrixRMaj
154173 * @param outputC Dense Matrix
155174 */
156175 public static DMatrixRMaj multTransB ( DMatrixSparseCSC A , DMatrixRMaj B , @ Nullable DMatrixRMaj outputC ,
157- @ Nullable GrowArray <DGrowArray > listWork ) {
176+ @ Nullable GrowArray <DGrowArray > workArrays ) {
158177 if (A .numCols != B .numCols )
159178 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
160179 outputC = reshapeOrDeclare (outputC , A .numRows , B .numRows );
161180
162- ImplMultiplication_MT_DSCC .multTransB (A , B , outputC , listWork );
181+ if (workArrays == null )
182+ workArrays = new GrowArray <>(DGrowArray ::new );
183+
184+ ImplMultiplication_MT_DSCC .multTransB (A , B , outputC , workArrays );
163185
164186 return outputC ;
165187 }
@@ -168,12 +190,44 @@ public static DMatrixRMaj multTransB( DMatrixSparseCSC A, DMatrixRMaj B, @Nullab
168190 * <p>C = C + A*B<sup>T</sup></p>
169191 */
170192 public static void multAddTransB ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ,
171- @ Nullable GrowArray <DGrowArray > listWork ) {
193+ @ Nullable GrowArray <DGrowArray > workArrays ) {
172194 if (A .numCols != B .numCols )
173195 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
174196 if (A .numRows != outputC .numRows || B .numRows != outputC .numCols )
175197 throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B , outputC ));
176198
177- ImplMultiplication_MT_DSCC .multAddTransB (A , B , outputC , listWork );
199+ if (workArrays == null )
200+ workArrays = new GrowArray <>(DGrowArray ::new );
201+
202+ ImplMultiplication_MT_DSCC .multAddTransB (A , B , outputC , workArrays );
203+ }
204+
205+ /**
206+ * Performs matrix multiplication. C = A<sup>T</sup>*B<sup>T</sup>
207+ *
208+ * @param A Matrix
209+ * @param B Dense Matrix
210+ * @param outputC Dense Matrix
211+ */
212+ public static DMatrixRMaj multTransAB ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ) {
213+ if (A .numRows != B .numCols )
214+ throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
215+ outputC = reshapeOrDeclare (outputC , A .numCols , B .numRows );
216+
217+ ImplMultiplication_MT_DSCC .multTransAB (A , B , outputC );
218+
219+ return outputC ;
220+ }
221+
222+ /**
223+ * <p>C = C + A<sup>T</sup>*B<sup>T</sup></p>
224+ */
225+ public static void multAddTransAB ( DMatrixSparseCSC A , DMatrixRMaj B , DMatrixRMaj outputC ) {
226+ if (A .numRows != B .numCols )
227+ throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B ));
228+ if (A .numCols != outputC .numRows || B .numRows != outputC .numCols )
229+ throw new MatrixDimensionException ("Inconsistent matrix shapes. " + stringShapes (A , B , outputC ));
230+
231+ ImplMultiplication_MT_DSCC .multAddTransAB (A , B , outputC );
178232 }
179233}
0 commit comments