docs: function(matrix) {
      if (!matrix.elements) {
        return this.map(function(x) { return x * matrix; });
      }
      var returnVector = matrix.modulus ? true : false;
      var M = matrix.elements || matrix;
      if (typeof(M[0][0]) == 'undefined') { M = Matrix.create(M).elements; }
      if (!this.canMultiplyFromLeft(M)) { return null; }
      var ni = this.elements.length, ki = ni, i, nj, kj = M[0].length, j;
      var cols = this.elements[0].length, elements = [], sum, nc, c;
      do { i = ki - ni;
        elements[i] = [];
        nj = kj;
        do { j = kj - nj;
          sum = 0;
          nc = cols;
          do { c = cols - nc;
            sum += this.elements[i][c] * M[c][j];
          } while (--nc);
          elements[i][j] = sum;
        } while (--nj);
      } while (--ni);
      var M = Matrix.create(elements);
      return returnVector ? M.col(1) : M;
    }