/// <summary> /// Generates diagonal Matriz /// </summary> /// <param name="diag_vector">column vector containing the diag elements</param> /// <param name="offset">Offset of matrix</param> /// <returns>Diagonal matrix</returns> public static Matriz Diag(Matriz diag_vector, int offset) { int dim = diag_vector.VectorLength(); if (dim == 0) { throw new ArgumentException("diag_vector must be 1xN or Nx1."); } ////if (Math.Abs(offset) >= dim) //// throw new ArgumentException("Absolute value of offset must be less than length of diag_vector."); Matriz m = new Matriz(dim + Math.Abs(offset), dim + Math.Abs(offset)); dim = m.RowCount; if (offset >= 0) { for (int i = 1; i <= dim - offset; i++) { m[i, i + offset] = diag_vector[i]; } } else { for (int i = 1; i <= dim + offset; i++) { m[i - offset, i] = diag_vector[i]; } } return m; }
/// <summary> /// Implements the dot product of two vectors. /// </summary> /// <param name="v">Row or column vector.</param> /// <param name="w">Row or column of other vector.</param> /// <returns>Dot product.</returns> public static Complex Dot(Matriz v, Matriz w) { int m = v.VectorLength(); int n = w.VectorLength(); if (m == 0 || n == 0) { throw new ArgumentException("Arguments need to be vectors."); } else if (m != n) { throw new ArgumentException("Vectors must be of the same length."); } Complex buf = Complex.Zero; for (int i = 1; i <= m; i++) { buf += v[i] * w[i]; } return buf; }
/// <summary> /// Generates diagonal Matriz /// </summary> /// <param name="diag_vector">column vector containing the diag elements</param> /// <returns>Diagonal matrix</returns> public static Matriz Diag(Matriz diag_vector) { int dim = diag_vector.VectorLength(); if (dim == 0) { throw new ArgumentException("diag_vector must be 1xN or Nx1"); } Matriz m = new Matriz(dim, dim); for (int i = 1; i <= dim; i++) { m[i, i] = diag_vector[i]; } return m; }