public override void Assign <T>(NArray <T> a, NArrayBool condition, NArray <T> result) { T[] aArray, resultArray; bool[] cArray; int aStart, cStart, resultStart; GetArray(a, out aArray, out aStart); GetArray(condition, out cArray, out cStart); GetArray(result, out resultArray, out resultStart); if (a.IsScalar) { for (int i = 0; i < result.Length; ++i) { if (cArray[cStart + i]) { resultArray[resultStart + i] = aArray[aStart]; } } } else { for (int i = 0; i < result.Length; ++i) { if (cArray[cStart + i]) { resultArray[resultStart + i] = aArray[aStart + i]; } } } }
public override void RelativeOperation(NArray <int> a, NArray <int> b, NArrayBool result, RelativeOperator op) { int[] aArray, bArray; bool[] resultArray; int aStart, bStart, resultStart; GetArray(a, out aArray, out aStart); GetArray(b, out bArray, out bStart); GetArray(result, out resultArray, out resultStart); switch (op) { case RelativeOperator.LessThan: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] < bArray[bStart + i]; } break; case RelativeOperator.LessThanEquals: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] <= bArray[bStart + i]; } break; case RelativeOperator.Equals: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] == bArray[bStart + i]; } break; case RelativeOperator.NotEquals: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] != bArray[bStart + i]; } break; case RelativeOperator.GreaterThanEquals: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] >= bArray[bStart + i]; } break; case RelativeOperator.GreaterThan: for (int i = 0; i < resultArray.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] > bArray[bStart + i]; } break; } }
public override void LogicalOperation(NArrayBool a, NArrayBool b, NArrayBool result, LogicalBinaryElementWiseOperation operation) { bool[] aArray, bArray, resultArray; int aStart, bStart, resultStart; GetArray(a, out aArray, out aStart); GetArray(b, out bArray, out bStart); GetArray(result, out resultArray, out resultStart); if (operation == LogicalBinaryElementWiseOperation.And) { for (int i = 0; i < result.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] && bArray[bStart + i]; } } else if (operation == LogicalBinaryElementWiseOperation.Or) { for (int i = 0; i < result.Length; ++i) { resultArray[resultStart + i] = aArray[aStart + i] || bArray[bStart + i]; } } }
public abstract void Assign <T>(NArray <T> a, NArrayBool condition, NArray <T> result);
public abstract void LogicalOperation(NArrayBool a, NArrayBool b, NArrayBool result, LogicalBinaryElementWiseOperation operation);
public abstract void RelativeOperation(NArray <int> a, int b, NArrayBool result, RelativeOperator op);
public abstract void RelativeOperation(NArray <double> a, double b, NArrayBool result, RelativeOperator op);