matVecMul function

Tensor<Vector> matVecMul(
  1. Tensor<Matrix> M,
  2. Tensor<Vector> v
)

Implementation

Tensor<Vector> matVecMul(Tensor<Matrix> M, Tensor<Vector> v) {
  int numRows = M.value.length;
  int numCols = M.value[0].length;
  Vector outValue = [];
  for (int i = 0; i < numRows; i++) {
    outValue.add(0.0);
  }
  for (int i = 0; i < numRows; i++) {
    for (int j = 0; j < numCols; j++) {
      outValue[i] += M.value[i][j] * v.value[j];
    }
  }
  Tensor<Vector> out = Tensor<Vector>(outValue);
  out.creator = Node(
    [M, v],
    () {
      for (int i = 0; i < numRows; i++) {
        for (int j = 0; j < numCols; j++) {
          M.grad[i][j] += out.grad[i] * v.value[j];
        }
      }
      for (int j = 0; j < numCols; j++) {
        for (int i = 0; i < numRows; i++) {
          v.grad[j] += M.value[i][j] * out.grad[i];
        }
      }
    },
    opName: 'matVecMul', // This name is already unique
    cost: 2 * numRows * numCols,
  );
  return out;
}