/// <summary> /// Creates a double sparse vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a double. /// </summary> /// <returns> /// A double sparse vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static SparseVector Parse(string value, IFormatProvider formatProvider = null) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // parsing var tokens = value.Split(new[] { formatProvider.GetTextInfo().ListSeparator, " ", "\t" }, StringSplitOptions.RemoveEmptyEntries); var data = tokens.Select(t => double.Parse(t, NumberStyles.Any, formatProvider)).ToList(); if (data.Count == 0) { throw new FormatException(); } return(new SparseVector(SparseVectorStorage <double> .OfEnumerable(data))); }
/// <summary> /// Creates a float sparse vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n,n,..', '(n,n,..)', '[n,n,...]', where n is a float. /// </summary> /// <returns> /// A float sparse vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static SparseVector Parse(string value, IFormatProvider formatProvider) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // parsing var tokens = value.Split(new[] { formatProvider.GetTextInfo().ListSeparator, " ", "\t" }, StringSplitOptions.RemoveEmptyEntries); var data = tokens.Select(t => float.Parse(t, NumberStyles.Any, formatProvider)).ToList(); if (data.Count == 0) throw new FormatException(); return OfEnumerable(data); }
/// <summary> /// Creates a Complex32 dense vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. /// </summary> /// <returns> /// A Complex32 dense vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static DenseVector Parse(string value, IFormatProvider formatProvider) { if (value == null) { throw new ArgumentNullException(value); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // keywords var textInfo = formatProvider.GetTextInfo(); var keywords = new[] { textInfo.ListSeparator }; // lexing var tokens = new LinkedList <string>(); GlobalizationHelper.Tokenize(tokens.AddFirst(value), keywords, 0); var token = tokens.First; if (token == null || tokens.Count.IsEven()) { throw new FormatException(); } // parsing var data = new Complex32[(tokens.Count + 1) >> 1]; for (var i = 0; i < data.Length; i++) { if (token == null || token.Value == textInfo.ListSeparator) { throw new FormatException(); } data[i] = token.Value.ToComplex32(formatProvider); token = token.Next; if (token != null) { token = token.Next; } } return(new DenseVector(data)); }
/// <summary> /// Creates a Complex dense vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a double. /// </summary> /// <returns> /// A Complex dense vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static DenseVector Parse(string value, IFormatProvider formatProvider) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // keywords var textInfo = formatProvider.GetTextInfo(); var keywords = new[] { textInfo.ListSeparator }; // lexing var tokens = new LinkedList<string>(); GlobalizationHelper.Tokenize(tokens.AddFirst(value), keywords, 0); var token = tokens.First; if (token == null || tokens.Count.IsEven()) { throw new FormatException(); } // parsing var data = new Complex[(tokens.Count + 1) >> 1]; for (var i = 0; i < data.Length; i++) { if (token == null || token.Value == textInfo.ListSeparator) { throw new FormatException(); } data[i] = token.Value.ToComplex(formatProvider); token = token.Next; if (token != null) { token = token.Next; } } return new DenseVector(data); }
/// <summary> /// Creates a double sparse vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. /// </summary> /// <returns> /// A double sparse vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static SparseVector Parse(string value, IFormatProvider formatProvider = null) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // parsing var strongTokens = value.Split(new[] { formatProvider.GetTextInfo().ListSeparator }, StringSplitOptions.RemoveEmptyEntries); var data = new List<Complex32>(); foreach (string strongToken in strongTokens) { var weakTokens = strongToken.Split(new[] { " ", "\t" }, StringSplitOptions.RemoveEmptyEntries); string current = string.Empty; for (int i = 0; i < weakTokens.Length; i++) { current += weakTokens[i]; if (current.EndsWith("+") || current.EndsWith("-") || current.StartsWith("(") && !current.EndsWith(")")) { continue; } var ahead = i < weakTokens.Length - 1 ? weakTokens[i + 1] : string.Empty; if (ahead.StartsWith("+") || ahead.StartsWith("-")) { continue; } data.Add(current.ToComplex32(formatProvider)); current = string.Empty; } if (current != string.Empty) { throw new FormatException(); } } if (data.Count == 0) { throw new FormatException(); } return OfEnumerable(data); }
/// <summary> /// Creates a double sparse vector based on a string. The string can be in the following formats (without the /// quotes): 'n', 'n;n;..', '(n;n;..)', '[n;n;...]', where n is a Complex32. /// </summary> /// <returns> /// A double sparse vector containing the values specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information. /// </param> public static SparseVector Parse(string value, IFormatProvider formatProvider = null) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } if (value.StartsWith("[", StringComparison.Ordinal)) { if (!value.EndsWith("]", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // parsing var strongTokens = value.Split(new[] { formatProvider.GetTextInfo().ListSeparator }, StringSplitOptions.RemoveEmptyEntries); var data = new List <Complex32>(); foreach (string strongToken in strongTokens) { var weakTokens = strongToken.Split(new[] { " ", "\t" }, StringSplitOptions.RemoveEmptyEntries); string current = string.Empty; for (int i = 0; i < weakTokens.Length; i++) { current += weakTokens[i]; if (current.EndsWith("+") || current.EndsWith("-") || current.StartsWith("(") && !current.EndsWith(")")) { continue; } var ahead = i < weakTokens.Length - 1 ? weakTokens[i + 1] : string.Empty; if (ahead.StartsWith("+") || ahead.StartsWith("-")) { continue; } data.Add(current.ToComplex32(formatProvider)); current = string.Empty; } if (current != string.Empty) { throw new FormatException(); } } if (data.Count == 0) { throw new FormatException(); } return(OfEnumerable(data)); }
/// <summary> /// Creates a complex number based on a string. The string can be in the /// following formats (without the quotes): 'n', 'ni', 'n +/- ni', /// 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. /// </summary> /// <returns> /// A complex number containing the value specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific /// formatting information. /// </param> public static Complex ToComplex(this string value, IFormatProvider formatProvider) { if (value == null) { throw new ArgumentNullException(nameof(value)); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // keywords var numberFormatInfo = formatProvider.GetNumberFormatInfo(); var textInfo = formatProvider.GetTextInfo(); var keywords = new[] { textInfo.ListSeparator, numberFormatInfo.NaNSymbol, numberFormatInfo.NegativeInfinitySymbol, numberFormatInfo.PositiveInfinitySymbol, "+", "-", "i", "j" }; // lexing var tokens = new LinkedList <string>(); GlobalizationHelper.Tokenize(tokens.AddFirst(value), keywords, 0); var token = tokens.First; // parse the left part var leftPart = ParsePart(ref token, out var isLeftPartImaginary, formatProvider); if (token == null) { return(isLeftPartImaginary ? new Complex(0, leftPart) : new Complex(leftPart, 0)); } // parse the right part if (token.Value == textInfo.ListSeparator) { // format: real,imag token = token.Next; if (isLeftPartImaginary) { // left must not contain 'i', right doesn't matter. throw new FormatException(); } var rightPart = ParsePart(ref token, out _, formatProvider); return(new Complex(leftPart, rightPart)); } else { // format: real + imag var rightPart = ParsePart(ref token, out var isRightPartImaginary, formatProvider); if (!(isLeftPartImaginary ^ isRightPartImaginary)) { // either left or right part must contain 'i', but not both. throw new FormatException(); } return(isLeftPartImaginary ? new Complex(rightPart, leftPart) : new Complex(leftPart, rightPart)); } }
/// <summary> /// Creates a complex number based on a string. The string can be in the /// following formats (without the quotes): 'n', 'ni', 'n +/- ni', /// 'ni +/- n', 'n,n', 'n,ni,' '(n,n)', or '(n,ni)', where n is a double. /// </summary> /// <returns> /// A complex number containing the value specified by the given string. /// </returns> /// <param name="value"> /// the string to parse. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific /// formatting information. /// </param> public static Complex ToComplex(this string value, IFormatProvider formatProvider) { if (value == null) { throw new ArgumentNullException("value"); } value = value.Trim(); if (value.Length == 0) { throw new FormatException(); } // strip out parens if (value.StartsWith("(", StringComparison.Ordinal)) { if (!value.EndsWith(")", StringComparison.Ordinal)) { throw new FormatException(); } value = value.Substring(1, value.Length - 2).Trim(); } // keywords var numberFormatInfo = formatProvider.GetNumberFormatInfo(); var textInfo = formatProvider.GetTextInfo(); var keywords = new[] { textInfo.ListSeparator, numberFormatInfo.NaNSymbol, numberFormatInfo.NegativeInfinitySymbol, numberFormatInfo.PositiveInfinitySymbol, "+", "-", "i", "j" }; // lexing var tokens = new LinkedList<string>(); GlobalizationHelper.Tokenize(tokens.AddFirst(value), keywords, 0); var token = tokens.First; // parse the left part bool isLeftPartImaginary; var leftPart = ParsePart(ref token, out isLeftPartImaginary, formatProvider); if (token == null) { return isLeftPartImaginary ? new Complex(0, leftPart) : new Complex(leftPart, 0); } // parse the right part if (token.Value == textInfo.ListSeparator) { // format: real,imag token = token.Next; if (isLeftPartImaginary) { // left must not contain 'i', right doesn't matter. throw new FormatException(); } bool isRightPartImaginary; var rightPart = ParsePart(ref token, out isRightPartImaginary, formatProvider); return new Complex(leftPart, rightPart); } else { // format: real + imag bool isRightPartImaginary; var rightPart = ParsePart(ref token, out isRightPartImaginary, formatProvider); if (!(isLeftPartImaginary ^ isRightPartImaginary)) { // either left or right part must contain 'i', but not both. throw new FormatException(); } return isLeftPartImaginary ? new Complex(rightPart, leftPart) : new Complex(leftPart, rightPart); } }