void CopyToUnchecked(SparseVectorStorage <T> target) { if (ReferenceEquals(this, target)) { return; } if (Length != target.Length) { var message = $"Matrix dimensions must agree: op1 is {Length}, op2 is {target.Length}."; throw new ArgumentException(message, nameof(target)); } target.ValueCount = ValueCount; target.Values = new T[ValueCount]; target.Indices = new int[ValueCount]; if (ValueCount != 0) { Array.Copy(Values, 0, target.Values, 0, ValueCount); Buffer.BlockCopy(Indices, 0, target.Indices, 0, ValueCount * Constants.SizeOfInt); } }
void CopySubVectorToUnchecked(SparseVectorStorage <T> target, int sourceIndex, int targetIndex, int count, ExistingData existingData) { var offset = targetIndex - sourceIndex; var sourceFirst = Array.BinarySearch(Indices, 0, ValueCount, sourceIndex); var sourceLast = Array.BinarySearch(Indices, 0, ValueCount, sourceIndex + count - 1); if (sourceFirst < 0) { sourceFirst = ~sourceFirst; } if (sourceLast < 0) { sourceLast = ~sourceLast - 1; } int sourceCount = sourceLast - sourceFirst + 1; // special case when copying to itself if (ReferenceEquals(this, target)) { var values = new T[sourceCount]; var indices = new int[sourceCount]; Array.Copy(Values, sourceFirst, values, 0, sourceCount); for (int i = 0; i < indices.Length; i++) { indices[i] = Indices[i + sourceFirst]; } if (existingData == ExistingData.Clear) { Clear(targetIndex, count); } for (int i = sourceFirst; i <= sourceLast; i++) { At(indices[i] + offset, values[i]); } return; } // special case for empty target - much faster if (target.ValueCount == 0) { var values = new T[sourceCount]; var indices = new int[sourceCount]; Array.Copy(Values, sourceFirst, values, 0, sourceCount); for (int i = 0; i < indices.Length; i++) { indices[i] = Indices[i + sourceFirst] + offset; } target.ValueCount = sourceCount; target.Values = values; target.Indices = indices; return; } if (existingData == ExistingData.Clear) { target.Clear(targetIndex, count); } for (int i = sourceFirst; i <= sourceLast; i++) { target.At(Indices[i] + offset, Values[i]); } }