/// <summary> /// Returns a column vector of the linear indices of the result. /// <see cref="https://www.mathworks.com/help/matlab/ref/find.html?s_tid=srchtitle"/> /// </summary> /// <param name="vec"></param> /// <returns></returns> public static VectorC find(VectorC vec) { var noneZeroIndices = new List <double>(); for (var i = 0; i < vec.Vec.Count; ++i) { if (vec.Vec[i] != 0) { var index = i + 1; noneZeroIndices.Add(index); } } return(VectorC.Build.DenseOfArray(noneZeroIndices.ToArray())); }
public void TestSort() { var x = new VectorM(3.2m, 1.3m, 9.0m, 7.6m, 2.6m); x.Sort(); Assert.AreEqual<VectorM>( new VectorM(1.3m, 2.6m, 3.2m, 7.6m, 9.0m), x); x.Sort(true); Assert.AreEqual<VectorM>( new VectorM(9.0m, 7.6m, 3.2m, 2.6m, 1.3m), x); var y = new VectorC( new ComplexD(2, 3), new ComplexD(-1, -4), new ComplexD(6, 7), new ComplexD(1, 2)); y.Sort(); Assert.AreEqual<VectorC>( new VectorC( new ComplexD(-1, -4), new ComplexD(1, 2), new ComplexD(2, 3), new ComplexD(6, 7)), y); y.Sort(true); Assert.AreEqual<VectorC>( new VectorC( new ComplexD(6, 7), new ComplexD(2, 3), new ComplexD(1, 2), new ComplexD(-1, -4)), y); }
public void TestSum() { var x = new VectorM(3.2m, 1.3m, 9.0m, 7.6m, 2.6m); var sumX = x.Sum(); Assert.AreEqual<decimal>(23.7m, sumX); var y = new VectorC( new ComplexD(2, 3), new ComplexD(-1, -4), new ComplexD(6, 7), new ComplexD(1, 2)); //var sumY = y.Sum(); }
public static VectorC floor(VectorC vec) => vec.Vec.PointwiseFloor();
public static double min(VectorC vec) => vec.Vec.Min();
public static double max(VectorC vec) => vec.Vec.Max();
public static double norm(VectorC vec) => vec.Vec.Norm(2);
public static int length(VectorC vec) => vec.Vec.Count;
public static double sum(VectorC vec) => vec.Vec.Sum();
public static VectorC exp(VectorC vec) => vec.Vec.PointwiseExp();
public List<double> NonNegLeastSquares(double[,] matrix, List<double> values) { List<double> normalizedValues = this.NormalizeIntensities(values); //to handle < 20 intensiites for isotopes //otherwise vector-matrix length mismatch and crash List<double> tempValues = new List<double>(); for (int i = 0; i < 20; i++) { if (i < normalizedValues.Count) { tempValues.Add(normalizedValues[i]); } else { tempValues.Add(0); } } List<double> results = new List<double>(); double[,] tempMatrix = new double[tempValues.Count, 1]; //hardcoded to handle only 20 isotope intensities for (int i = 0; i < 20; i++) { if (i < normalizedValues.Count) { tempMatrix[i, 0] = normalizedValues[i]; } else { tempMatrix[i, 0] = 0; } } MatrixC theoretical = new MatrixC(tempMatrix); double[] experimental = new double[values.Count]; for (int i = 0; i < values.Count; i++) { experimental[i] = values[i]; } VectorC v = new VectorC(experimental); var result = solver.MatchLibraryMatrix(theoretical, v); for (int i = 0; i < result.GetSize(); i++) { results.Add(result[i]); } //calcualte %of each component double sum = 0; for (int j = 0; j < result.GetSize(); j++) { sum += results[j]; } for (int k = 0; k < result.GetSize(); k++) { results[k] = results[k] / sum; } return results; }