/** Multiply arguments element by element. Returns result. */
  public Object mul(Object param1, Object param2) throws ParseException {

    if (param1 instanceof MatrixValueI && param2 instanceof MatrixValueI) {
      return mul((MatrixValueI) param1, (MatrixValueI) param2);
    } else if (param1 instanceof MatrixValueI) {
      MatrixValueI l = (MatrixValueI) param1;
      MatrixValueI res = Tensor.getInstance(l.getDim());
      for (int i = 0; i < res.getNumEles(); ++i) res.setEle(i, super.mul(l.getEle(i), param2));
      return res;
    } else if (param2 instanceof MatrixValueI) {
      MatrixValueI r = (MatrixValueI) param2;
      MatrixValueI res = Tensor.getInstance(r.getDim());
      for (int i = 0; i < res.getNumEles(); ++i) res.setEle(i, super.mul(param1, r.getEle(i)));
      return res;
    }
    return super.mul(param1, param2);
  }
 public Object mul(MatrixValueI param1, MatrixValueI param2) throws ParseException {
   Dimensions dims = this.calcDim(new Dimensions[] {param1.getDim(), param2.getDim()});
   MatrixValueI res = Tensor.getInstance(dims);
   return this.calcValue(res, new MatrixValueI[] {param1, param2});
 }