|
|
|
@ -774,7 +774,75 @@ namespace MathNet.Numerics.LinearAlgebra.Storage |
|
|
|
return base.Find2Unchecked(other, predicate, zeros); |
|
|
|
} |
|
|
|
|
|
|
|
// FUNCTIONAL COMBINATORS
|
|
|
|
// FUNCTIONAL COMBINATORS: MAP
|
|
|
|
|
|
|
|
public override void MapInplace(Func<T, T> f, Zeros zeros = Zeros.AllowSkip) |
|
|
|
{ |
|
|
|
var indices = new List<int>(); |
|
|
|
var values = new List<T>(ValueCount); |
|
|
|
if (zeros == Zeros.Include || !Zero.Equals(f(Zero))) |
|
|
|
{ |
|
|
|
int k = 0; |
|
|
|
for (int i = 0; i < Length; i++) |
|
|
|
{ |
|
|
|
var item = k < ValueCount && (Indices[k]) == i ? f(Values[k++]) : f(Zero); |
|
|
|
if (!Zero.Equals(item)) |
|
|
|
{ |
|
|
|
values.Add(item); |
|
|
|
indices.Add(i); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (int i = 0; i < ValueCount; i++) |
|
|
|
{ |
|
|
|
var item = f(Values[i]); |
|
|
|
if (!Zero.Equals(item)) |
|
|
|
{ |
|
|
|
values.Add(item); |
|
|
|
indices.Add(Indices[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
Indices = indices.ToArray(); |
|
|
|
Values = values.ToArray(); |
|
|
|
ValueCount = values.Count; |
|
|
|
} |
|
|
|
|
|
|
|
public override void MapIndexedInplace(Func<int, T, T> f, Zeros zeros = Zeros.AllowSkip) |
|
|
|
{ |
|
|
|
var indices = new List<int>(); |
|
|
|
var values = new List<T>(ValueCount); |
|
|
|
if (zeros == Zeros.Include) |
|
|
|
{ |
|
|
|
int k = 0; |
|
|
|
for (int i = 0; i < Length; i++) |
|
|
|
{ |
|
|
|
var item = k < ValueCount && (Indices[k]) == i ? f(i, Values[k++]) : f(i, Zero); |
|
|
|
if (!Zero.Equals(item)) |
|
|
|
{ |
|
|
|
values.Add(item); |
|
|
|
indices.Add(i); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
for (int i = 0; i < ValueCount; i++) |
|
|
|
{ |
|
|
|
var item = f(Indices[i], Values[i]); |
|
|
|
if (!Zero.Equals(item)) |
|
|
|
{ |
|
|
|
values.Add(item); |
|
|
|
indices.Add(Indices[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
Indices = indices.ToArray(); |
|
|
|
Values = values.ToArray(); |
|
|
|
ValueCount = values.Count; |
|
|
|
} |
|
|
|
|
|
|
|
internal override void MapToUnchecked<TU>(VectorStorage<TU> target, Func<T, TU> f, Zeros zeros, ExistingData existingData) |
|
|
|
{ |
|
|
|
@ -1074,6 +1142,8 @@ namespace MathNet.Numerics.LinearAlgebra.Storage |
|
|
|
base.Map2ToUnchecked(target, other, f, zeros, existingData); |
|
|
|
} |
|
|
|
|
|
|
|
// FUNCTIONAL COMBINATORS: MAP
|
|
|
|
|
|
|
|
internal override TState Fold2Unchecked<TOther, TState>(VectorStorage<TOther> other, Func<TState, T, TOther, TState> f, TState state, Zeros zeros) |
|
|
|
{ |
|
|
|
var sparseOther = other as SparseVectorStorage<TOther>; |
|
|
|
|