/// <summary> /// 3x3 Rotation Matrix From normalized quaternion /// </summary> /// <returns></returns> public QsMatrix To_3x3_RotationMatrix() { var w = a; var x = i; var y = j; var z = k; var v0 = new QsVector(); var v1 = new QsVector(); var v2 = new QsVector(); v0.AddComponent(1 - 2 * y * y - 2 * z * z); v0.AddComponent(2 * x * y - 2 * w * z); v0.AddComponent(2 * x * z + 2 * w * y); v1.AddComponent(2 * x * y + 2 * w * z); v1.AddComponent(1 - 2 * x * x - 2 * z * z); v1.AddComponent(2 * y * z - 2 * w * x); v2.AddComponent(2 * x * z - 2 * w * y); v2.AddComponent(2 * y * z + 2 * w * x); v2.AddComponent(1 - 2 * x * x - 2 * y * y); var rm = new QsMatrix(v0, v1, v2); return(rm); }
public QsValue QsValueElements(int fromIndex, int toIndex, QsValue arg0, QsValue arg1, QsValue arg2, QsValue arg3, QsValue arg4, QsValue arg5) { QsValue firstElement = GetElementValue(fromIndex, arg0, arg1, arg2, arg3, arg4, arg5); if (firstElement is QsScalar) { //return vector QsVector Total = new QsVector(System.Math.Abs(toIndex - fromIndex) + 1); Total.AddComponent((QsScalar)firstElement); if (toIndex >= fromIndex) { for (int i = fromIndex + 1; i <= toIndex; i++) { Total.AddComponent((QsScalar)GetElementValue(i, arg0, arg1, arg2, arg3, arg4, arg5)); } } else { for (int i = fromIndex - 1; i >= toIndex; i--) { Total.AddComponent((QsScalar)GetElementValue(i, arg0, arg1, arg2, arg3, arg4, arg5)); } } return(Total); } else if (firstElement is QsVector) { //return vector QsMatrix Total = new QsMatrix(); Total.AddVector((QsVector)firstElement); if (toIndex >= fromIndex) { for (int i = fromIndex + 1; i <= toIndex; i++) { Total.AddVector((QsVector)GetElementValue(i, arg0, arg1, arg2, arg3, arg4, arg5)); } } else { for (int i = fromIndex - 1; i >= toIndex; i++) { Total.AddVector((QsVector)GetElementValue(i, arg0, arg1, arg2, arg3, arg4, arg5)); } } return(Total); } else if (firstElement is QsMatrix) { throw new NotImplementedException(); } else { throw new NotSupportedException(); } }
public static QsValue Determinant(QsParameter matrix) { if (matrix.QsNativeValue is QsMatrix) { return(QsMatrix.Determinant(((QsMatrix)matrix.QsNativeValue))); } else { throw new QsInvalidInputException("Expected matrix input"); } }
public static QsValue Log(QsParameter val, QsParameter newBase) { if (val.IsQsValue) { if (val.ParameterValue is QsScalar) { AnyQuantity <double> q = ((QsScalar)val.ParameterValue).NumericalQuantity; if (q.Dimension.IsDimensionless) { double r = System.Math.Log(q.Value, ((QsScalar)newBase.ParameterValue).NumericalQuantity.Value); return(r.ToQuantity().ToScalarValue()); } else { throw new QsInvalidInputException("Non dimensionless number"); } } else if (val.ParameterValue is QsVector) { QsVector vec = (QsVector)val.ParameterValue; QsVector rv = new QsVector(vec.Count); foreach (QsScalar var in vec) { if (var.NumericalQuantity.Dimension.IsDimensionless) { double r = System.Math.Log(var.NumericalQuantity.Value, ((QsScalar)newBase.ParameterValue).NumericalQuantity.Value); rv.AddComponent(r.ToQuantity().ToScalar()); } else { throw new QsInvalidInputException("Non dimensionless component"); } } return(rv); } else if (val.ParameterValue is QsMatrix) { QsMatrix mat = (QsMatrix)val.ParameterValue; QsMatrix rm = new QsMatrix(); foreach (var vec in mat.Rows) { rm.AddVector((QsVector)Log(QsParameter.MakeParameter(vec, string.Empty))); } return(rm); } else { return(null); } } else { //not known may be ordinary string return(null); } }
/// <summary> /// Get factorial for the <see>QsValue</see> whether it is Scalar, Vector, Matrix, and later Tensor. /// </summary> /// <param name="value"></param> /// <returns></returns> public static QsValue Factorial(QsValue value) { if (value is QsBoolean) { var b = (QsBoolean)value; return(new QsBoolean { Value = !b.Value }); } if (value is QsScalar) { QsScalar sv = (QsScalar)value; if (sv.ScalarType == ScalarTypes.NumericalQuantity) { AnyQuantity <double> number = sv.NumericalQuantity; return(new QsScalar { NumericalQuantity = QuantityFactorial(number) }); } else { throw new QsException("Unsupported scalar object"); } } else if (value is QsVector) { var vec = value as QsVector; QsVector rvec = new QsVector(vec.Count); foreach (var v in vec) { rvec.AddComponent((QsScalar)Factorial(v)); } return(rvec); } else if (value is QsMatrix) { var mat = value as QsMatrix; QsMatrix Total = new QsMatrix(); for (int IY = 0; IY < mat.RowsCount; IY++) { List <QsScalar> row = new List <QsScalar>(mat.ColumnsCount); for (int IX = 0; IX < mat.ColumnsCount; IX++) { row.Add((QsScalar)Factorial(mat[IY, IX])); } Total.AddRow(row.ToArray()); } return(Total); } else { throw new NotSupportedException(); } }
/// <summary> /// This is a tricky functions /// it returns Vector if components are Scalars. /// Matrix if components are Vectors /// </summary> /// <param name="fromIndex"></param> /// <param name="toIndex"></param> /// <returns></returns> public QsValue QsValueElements(int fromIndex, int toIndex) { if (this.Parameters.Length > 0) { List <string> ProcessedElements = new List <string>(); #region symbolic representation if (fromIndex > toIndex) { for (int e_ix = fromIndex; e_ix >= toIndex; e_ix--) { var se = GetElement(e_ix); // s[n](x) ..> $x*x^n+$n # symbolic variables shouldn't be changed ($x, $n) we should take care. // first preserve the symbolic variable with the same index name that we are going to change. string se_text = se.ElementDeclaration.Replace("$" + this.SequenceIndexName, "`"); // replace the index name with the se_text = se_text.Replace(this.SequenceIndexName, e_ix.ToString(CultureInfo.InvariantCulture)); // get back the symbolic se_text = se_text.Replace("`", "$" + this.SequenceIndexName); if (!string.IsNullOrEmpty(SequenceRangeStartName)) { se_text = se_text.Replace("$" + SequenceRangeStartName, "`"); se_text = se_text.Replace(SequenceRangeStartName, StartIndex.ToString(CultureInfo.InvariantCulture)); se_text = se_text.Replace("`", "$" + SequenceRangeStartName); } if (!string.IsNullOrEmpty(SequenceRangeEndName)) { se_text = se_text.Replace("$" + SequenceRangeEndName, "`"); se_text = se_text.Replace(SequenceRangeEndName, EndIndex.ToString(CultureInfo.InvariantCulture)); se_text = se_text.Replace("`", "$" + SequenceRangeEndName); } // replace the parameters in declaration with the same foreach (var param in this.Parameters) { se_text = se_text.Replace("$" + param.Name, "`"); se_text = se_text.Replace(param.Name, "$" + param.Name); se_text = se_text.Replace("`", "$" + param.Name); } ProcessedElements.Add(se_text); } } else { for (int e_ix = fromIndex; e_ix <= toIndex; e_ix++) { var se = GetElement(e_ix); string se_text = se.ElementDeclaration.Replace("$" + this.SequenceIndexName, "`"); se_text = se_text.Replace(this.SequenceIndexName, e_ix.ToString(CultureInfo.InvariantCulture)); se_text = se_text.Replace("`", "$" + this.SequenceIndexName); if (!string.IsNullOrEmpty(SequenceRangeStartName)) { se_text = se_text.Replace("$" + SequenceRangeStartName, "`"); se_text = se_text.Replace(SequenceRangeStartName, StartIndex.ToString(CultureInfo.InvariantCulture)); se_text = se_text.Replace("`", "$" + SequenceRangeStartName); } if (!string.IsNullOrEmpty(SequenceRangeEndName)) { se_text = se_text.Replace("$" + SequenceRangeEndName, "`"); se_text = se_text.Replace(SequenceRangeEndName, EndIndex.ToString(CultureInfo.InvariantCulture)); se_text = se_text.Replace("`", "$" + SequenceRangeEndName); } // replace the parameters with names foreach (var param in this.Parameters) { se_text = se_text.Replace("$" + param.Name, "`"); se_text = se_text.Replace(param.Name, "$" + param.Name); se_text = se_text.Replace("`", "$" + param.Name); } ProcessedElements.Add(se_text); } } var ee = QsEvaluator.CurrentEvaluator.SilentEvaluate(ProcessedElements[0]); QsValue Total; if (ee is QsScalar) { Total = new QsVector(System.Math.Abs(toIndex - fromIndex) + 1); foreach (string pel in ProcessedElements) { ((QsVector)Total).AddComponent((QsScalar)QsEvaluator.CurrentEvaluator.SilentEvaluate(pel)); } } else if (ee is QsVector) { Total = new QsMatrix(); foreach (string pel in ProcessedElements) { ((QsMatrix)Total).AddVector((QsVector)QsEvaluator.CurrentEvaluator.SilentEvaluate(pel)); } } else if (ee is QsMatrix) { Total = new QsTensor(); foreach (string pel in ProcessedElements) { ((QsTensor)Total).AddMatrix((QsMatrix)QsEvaluator.CurrentEvaluator.SilentEvaluate(pel)); } } else { throw new QsException("This is enough, no more than matrix values please."); } #endregion return(Total); } QsValue firstElement = (QsValue)GetElementValue(fromIndex); if (firstElement is QsScalar) { //return vector QsVector Total = new QsVector(System.Math.Abs(toIndex - fromIndex) + 1); #region Numerical Representation Total.AddComponent((QsScalar)firstElement); if (toIndex >= fromIndex) { for (int i = fromIndex + 1; i <= toIndex; i++) { Total.AddComponent((QsScalar)GetElementValue(i)); } } else { for (int i = fromIndex - 1; i >= toIndex; i--) { Total.AddComponent((QsScalar)GetElementValue(i)); } } #endregion return(Total); } else if (firstElement is QsVector) { //return vector QsMatrix Total = new QsMatrix(); Total.AddVector((QsVector)firstElement); if (toIndex >= fromIndex) { for (int i = fromIndex + 1; i <= toIndex; i++) { Total.AddVector((QsVector)GetElementValue(i)); } } else { for (int i = fromIndex - 1; i >= toIndex; i--) { Total.AddVector((QsVector)GetElementValue(i)); } } return(Total); } else if (firstElement is QsMatrix) { throw new NotImplementedException(); } else { throw new NotSupportedException(); } }
public static QsMatrix Identity(int diagonal) { return(QsMatrix.MakeIdentity(diagonal)); }