| 177 | } |
| 178 | |
| 179 | @Override |
| 180 | public void multiplyTranspose(Matrix b, Matrix C) |
| 181 | { |
| 182 | if(this.cols() != b.cols()) |
| 183 | throw new ArithmeticException("Matrix dimensions do not agree"); |
| 184 | else if (this.rows() != C.rows() || b.rows() != C.cols()) |
| 185 | throw new ArithmeticException("Target Matrix is no the correct size"); |
| 186 | |
| 187 | final int iLimit = this.rows(); |
| 188 | final int jLimit = b.rows(); |
| 189 | final int kLimit = this.cols(); |
| 190 | |
| 191 | for (int i0 = 0; i0 < iLimit; i0 += NB2) |
| 192 | for (int j0 = 0; j0 < jLimit; j0 += NB2) |
| 193 | for (int k0 = 0; k0 < kLimit; k0 += NB2) |
| 194 | for (int i = i0; i < min(i0 + NB2, iLimit); i++) |
| 195 | for (int j = j0; j < min(j0 + NB2, jLimit); j++) |
| 196 | { |
| 197 | double C_ij = 0; |
| 198 | for (int k = k0; k < min(k0 + NB2, kLimit); k++) |
| 199 | C_ij += this.get(i, k) * b.get(j, k); |
| 200 | C.increment(i, j, C_ij); |
| 201 | } |
| 202 | } |
| 203 | |
| 204 | @Override |
| 205 | public void multiplyTranspose(final Matrix b, final Matrix C, ExecutorService threadPool) |