/// <summary> /// Creates a new instance of the Vector class. /// </summary> /// <param name="data">The array to create this vector from.</param> /// <returns>The new <c>Vector</c>.</returns> protected override Vector<Complex32> CreateVector(IList<Complex32> data) { var vector = new SparseVector(data.Count); for (var index = 0; index < data.Count; index++) { vector[index] = data[index]; } return vector; }
/// <summary> /// Creates a vector containing specified elements. /// </summary> /// <param name="index">The first element to begin copying from.</param> /// <param name="length">The number of elements to copy.</param> /// <returns>A vector containing a copy of the specified elements.</returns> /// <exception cref="ArgumentOutOfRangeException"><list><item>If <paramref name="index"/> is not positive or /// greater than or equal to the size of the vector.</item> /// <item>If <paramref name="index"/> + <paramref name="length"/> is greater than or equal to the size of the vector.</item> /// </list></exception> /// <exception cref="ArgumentException">If <paramref name="length"/> is not positive.</exception> public override Vector<Complex32> SubVector(int index, int length) { if (index < 0 || index >= Count) { throw new ArgumentOutOfRangeException("index"); } if (length <= 0) { throw new ArgumentOutOfRangeException("length"); } if (index + length > Count) { throw new ArgumentOutOfRangeException("length"); } var result = new SparseVector(length); for (var i = index; i < index + length; i++) { result.At(i - index, At(i)); } return result; }
/// <summary> /// Returns a negated vector. /// </summary> /// <returns>The negated vector.</returns> /// <remarks>Added as an alternative to the unary negation operator.</remarks> public override Vector<Complex32> Negate() { var result = new SparseVector(Count) { _nonZeroValues = new Complex32[NonZerosCount], _nonZeroIndices = new int[NonZerosCount], NonZerosCount = NonZerosCount }; if (NonZerosCount != 0) { CommonParallel.For( 0, NonZerosCount, index => result._nonZeroValues[index] = -_nonZeroValues[index]); Buffer.BlockCopy(_nonZeroIndices, 0, result._nonZeroIndices, 0, NonZerosCount * Constants.SizeOfInt); } return result; }
/// <summary> /// Initializes a new instance of the <see cref="SparseVector"/> class by /// copying the values from another. /// </summary> /// <param name="other"> /// The vector to create the new vector from. /// </param> public SparseVector(SparseVector other) : this(other.Count) { // Lets copy only needed data. Portion of needed data is determined by NonZerosCount value _nonZeroValues = new Complex32[other.NonZerosCount]; _nonZeroIndices = new int[other.NonZerosCount]; NonZerosCount = other.NonZerosCount; if (other.NonZerosCount != 0) { CommonParallel.For(0, other.NonZerosCount, index => _nonZeroValues[index] = other._nonZeroValues[index]); Buffer.BlockCopy(other._nonZeroIndices, 0, _nonZeroIndices, 0, other.NonZerosCount * Constants.SizeOfInt); } }
public void CanCreateSparseMatrix() { var vector = new SparseVector(3); var matrix = Matrix<Complex32>.Build.SameAs(vector, 2, 3); Assert.IsInstanceOf<SparseMatrix>(matrix); Assert.AreEqual(2, matrix.RowCount); Assert.AreEqual(3, matrix.ColumnCount); }
public void CheckSparseMechanismByZeroMultiply() { var vector = new SparseVector(10000); // Add non-zero elements vector[200] = new Complex32(1.5f, 1); vector[500] = new Complex32(3.5f, 1); vector[800] = new Complex32(5.5f, 1); vector[0] = new Complex32(7.5f, 1); // Multiply by 0 vector *= 0; var storage = (SparseVectorStorage<Complex32>) vector.Storage; Assert.AreEqual(Complex32.Zero, vector[200]); Assert.AreEqual(Complex32.Zero, vector[500]); Assert.AreEqual(Complex32.Zero, vector[800]); Assert.AreEqual(Complex32.Zero, vector[0]); Assert.AreEqual(0, storage.ValueCount); }
/// <summary> /// Outer product of two vectors /// </summary> /// <param name="u">First vector</param> /// <param name="v">Second vector</param> /// <returns>Matrix M[i,j] = u[i]*v[j] </returns> /// <exception cref="ArgumentNullException">If the u vector is <see langword="null" />.</exception> /// <exception cref="ArgumentNullException">If the v vector is <see langword="null" />.</exception> public static Matrix <Complex32> /*SparseMatrix*/ OuterProduct(SparseVector u, SparseVector v) { if (u == null) { throw new ArgumentNullException("u"); } if (v == null) { throw new ArgumentNullException("v"); } var matrix = new SparseMatrix(u.Count, v.Count); for (var i = 0; i < u._storage.ValueCount; i++) { for (var j = 0; j < v._storage.ValueCount; j++) { if (u._storage.Indices[i] == v._storage.Indices[j]) { matrix.At(i, j, u._storage.Values[i] * v._storage.Values[j]); } } } return(matrix); }
/// <summary> /// Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. /// A return value indicates whether the conversion succeeded or failed. /// </summary> /// <param name="value"> /// A string containing a complex vector to convert. /// </param> /// <param name="result"> /// The parsed value. /// </param> /// <returns> /// If the conversion succeeds, the result will contain a complex number equivalent to value. /// Otherwise the result will be <c>null</c>. /// </returns> public static bool TryParse(string value, out SparseVector result) { return TryParse(value, null, out result); }
public void CanPointwiseMultiplySparseVector() { var zeroArray = new[] {Complex32.Zero, new Complex32(1.0f, 1), Complex32.Zero, new Complex32(1.0f, 1), Complex32.Zero}; var vector1 = SparseVector.OfEnumerable(Data); var vector2 = SparseVector.OfEnumerable(zeroArray); var result = new SparseVector(vector1.Count); vector1.PointwiseMultiply(vector2, result); for (var i = 0; i < vector1.Count; i++) { Assert.AreEqual(Data[i]*zeroArray[i], result[i]); } var resultStorage = (SparseVectorStorage<Complex32>) result.Storage; Assert.AreEqual(2, resultStorage.ValueCount); }
public void CanDotProductOfTwoSparseVectors() { var vectorA = new SparseVector(10000); vectorA[200] = 1; vectorA[500] = 3; vectorA[800] = 5; vectorA[100] = 7; vectorA[900] = 9; var vectorB = new SparseVector(10000); vectorB[300] = 3; vectorB[500] = 5; vectorB[800] = 7; Assert.AreEqual(new Complex32(50.0f, 0), vectorA.DotProduct(vectorB)); }
/// <summary> /// Multiplies a scalar to each element of the vector. /// </summary> /// <param name="scalar">The scalar to multiply.</param> /// <returns>A new vector that is the multiplication of the vector and the scalar.</returns> public override Vector<Complex32> Multiply(Complex32 scalar) { if (scalar == Complex32.One) { return Clone(); } if (scalar == Complex32.Zero) { return new SparseVector(Count); } var copy = new SparseVector(this); Control.LinearAlgebraProvider.ScaleArray(scalar, copy._nonZeroValues, copy._nonZeroValues); return copy; }
/// <summary> /// Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. /// A return value indicates whether the conversion succeeded or failed. /// </summary> /// <param name="value"> /// A string containing a complex vector to convert. /// </param> /// <param name="result"> /// The parsed value. /// </param> /// <returns> /// If the conversion succeeds, the result will contain a complex number equivalent to value. /// Otherwise the result will be <c>null</c>. /// </returns> public static bool TryParse(string value, out SparseVector result) { return(TryParse(value, null, out result)); }
/// <summary> /// Outer product of this and another vector. /// </summary> /// <param name="v">The vector to operate on.</param> /// <returns> /// Matrix M[i,j] = this[i] * v[j]. /// </returns> public Matrix <Complex32> OuterProduct(SparseVector v) { return(OuterProduct(this, v)); }
/// <summary> /// Outer product of two vectors /// </summary> /// <param name="u">First vector</param> /// <param name="v">Second vector</param> /// <returns>Matrix M[i,j] = u[i]*v[j] </returns> /// <exception cref="ArgumentNullException">If the u vector is <see langword="null" />.</exception> /// <exception cref="ArgumentNullException">If the v vector is <see langword="null" />.</exception> public static Matrix<Complex32> /*SparseMatrix*/ OuterProduct(SparseVector u, SparseVector v) { if (u == null) { throw new ArgumentNullException("u"); } if (v == null) { throw new ArgumentNullException("v"); } var matrix = new SparseMatrix(u.Count, v.Count); for (var i = 0; i < u._storage.ValueCount; i++) { for (var j = 0; j < v._storage.ValueCount; j++) { if (u._storage.Indices[i] == v._storage.Indices[j]) { matrix.At(i, j, u._storage.Values[i] * v._storage.Values[j]); } } } return matrix; }
public void CanScaleAVectorWhenSettingPreviousNonzeroElementsToZero() { var vector = new SparseVector(20); vector[10] = 1.0f; vector[11] = 2.0f; vector[11] = 0.0f; var scaled = new SparseVector(20); vector.Multiply(3.0f, scaled); Assert.AreEqual(3.0f, scaled[10].Real); Assert.AreEqual(0.0f, scaled[11].Real); }
/// <summary> /// Outer product of this and another vector. /// </summary> /// <param name="v">The vector to operate on.</param> /// <returns> /// Matrix M[i,j] = this[i] * v[j]. /// </returns> public Matrix<Complex32> OuterProduct(SparseVector v) { return OuterProduct(this, v); }
public void CheckSparseMechanismBySettingValues() { var vector = new SparseVector(10000); var storage = (SparseVectorStorage<Complex32>) vector.Storage; // Add non-zero elements vector[200] = new Complex32(1.5f, 1); Assert.AreEqual(new Complex32(1.5f, 1), vector[200]); Assert.AreEqual(1, storage.ValueCount); vector[500] = new Complex32(3.5f, 1); Assert.AreEqual(new Complex32(3.5f, 1), vector[500]); Assert.AreEqual(2, storage.ValueCount); vector[800] = new Complex32(5.5f, 1); Assert.AreEqual(new Complex32(5.5f, 1), vector[800]); Assert.AreEqual(3, storage.ValueCount); vector[0] = new Complex32(7.5f, 1); Assert.AreEqual(new Complex32(7.5f, 1), vector[0]); Assert.AreEqual(4, storage.ValueCount); // Remove non-zero elements vector[200] = Complex32.Zero; Assert.AreEqual(Complex32.Zero, vector[200]); Assert.AreEqual(3, storage.ValueCount); vector[500] = Complex32.Zero; Assert.AreEqual(Complex32.Zero, vector[500]); Assert.AreEqual(2, storage.ValueCount); vector[800] = Complex32.Zero; Assert.AreEqual(Complex32.Zero, vector[800]); Assert.AreEqual(1, storage.ValueCount); vector[0] = Complex32.Zero; Assert.AreEqual(Complex32.Zero, vector[0]); Assert.AreEqual(0, storage.ValueCount); }
/// <summary> /// Converts the string representation of a complex sparse vector to double-precision sparse vector equivalent. /// A return value indicates whether the conversion succeeded or failed. /// </summary> /// <param name="value"> /// A string containing a complex vector to convert. /// </param> /// <param name="formatProvider"> /// An <see cref="IFormatProvider"/> that supplies culture-specific formatting information about value. /// </param> /// <param name="result"> /// The parsed value. /// </param> /// <returns> /// If the conversion succeeds, the result will contain a complex number equivalent to value. /// Otherwise the result will be <c>null</c>. /// </returns> public static bool TryParse(string value, IFormatProvider formatProvider, out SparseVector result) { bool ret; try { result = Parse(value, formatProvider); ret = true; } catch (ArgumentNullException) { result = null; ret = false; } catch (FormatException) { result = null; ret = false; } return ret; }
public void CanCreateSparseMatrix() { var vector = new SparseVector(3); var matrix = vector.CreateMatrix(2, 3); Assert.AreEqual(2, matrix.RowCount); Assert.AreEqual(3, matrix.ColumnCount); }