저는 MiscUtils 라이브러리 (Marc G.와 Jon S.에게 감사합니다)를 사용 중이며 일반 Sqrt
함수를 추가하려고합니다.일반 Sqrt 구현
class N<T>
{
public N(T value)
{
Value = value;
}
public readonly T Value;
public static implicit operator T(N<T> n)
{
return n.Value;
}
public static implicit operator N<T>(T value)
{
return new N<T>(value);
}
public static T operator /(N<T> lhs, T rhs)
{
// Operator.Divide is essentially a wrapper around
// System.Linq.Expressions.Expression.Divide
return Operator.Divide(lhs.Value, rhs);
}
}
// fails with: No coercion operator is defined
// between types 'System.Double' and 'N`1[System.Single]'.
var n = new Numeric<float>(1f);
var x = Operator.DivideAlternative(n, 1.0);
// this works as the N<T> is first converted to a
// float via the implicit conversion operator
var result = n/1.0;
지금, 나는 이유 이런 일이 실현,하지만 난 아직 주위에 방법을 생각 할 수 없었던 : 문제는 쉽게 재현 할 수 있습니다. 참고로, 현재는 Sqrt
구현입니다. 표현 나무를 만드는 경험이 거의 없습니다.
public static double Sqrt<T>(T value)
{
double oldGuess = -1;
double guess = 1;
while(Abs(guess - oldGuess) > 1)
{
oldGuess = guess;
// the first evaluated call to DivideAlternative throws
guess = Operator.Divide(
Operator.AddAlternative(guess,
Operator.DivideAlternative(value, guess)),
2);
}
return guess;
}
편집 : 좋아, 그래서 난 내 자신에이 문제를 해결,하지만 난 분명히 너무 멀리 갔다 가능한 한 간단하게 질문을 유지하기위한 시도와 너무 많은 시간을 도우려고 혼란 사람들의 질문에 대답을 보냈다 .
그래서 전체적으로이 문제가 있습니다.
나는 두 개의 클래스; 하나는 변환을 수행하고 다른 하나는 이미지 데이터 (픽셀)의 통계적 분석을 수행합니다. 문제가 동일하므로 후자에 초점을 맞추어 보겠습니다.
abstract class ImageStatistics
{
private readonly object _pixels;
public ImageStatistics(object pixelArray)
{
Pixels = pixelArray;
}
// calculate the standard deviation of pixel values
public double CalcStdDev();
}
픽셀 배열은 숫자 유형이 될 수 있습니다. 실제로는 float
, int
, ushort
또는 byte
이됩니다. 지금 제네릭은 다음과 같은 일을 할 수 없기 때문에 :
public T Add<T>(T lhs, T rhs)
{
return lhs + rhs; // oops, no operator + for T
}
적절한 배열 유형으로 변환하지 않고 픽셀 값 자체에 대한 통계 분석을 수행 할 수 없습니다. 따라서 N 픽셀 유형을 지원하려면 ImageProcessor
의 N 하위 클래스가 있어야합니다.
글쎄, 그건 짜증. 나는 픽셀 데이터가 T[]
인 일반적인 ImageProcessor<T>
클래스를 갖고 싶다. 그래서, 나는 이것을 허용 할 MiscUtils 라이브러리를 들여다 보았다.
Math.Sqrt()를 약 5 나노초합니다. 이 코드는 ...하지 않습니다. –
@IgbyLargeman 제 1 자와 제 2 자 (포스터 및 스택 교환)가 누구인지 확실하지 않지만이 질문은 예를 들어 주목할만한 "제 3 자 라이브러리"인 .NET Framework와 마찬가지로 적법합니다. .. – AakashM
@HansPassant : 현재 성능에 지나치게 신경 쓰지는 않습니다. 단지 작동 시키려합니다. 나는 나중에 그것에 대해 걱정할 수 있습니다. 현재 나의 유스 케이스는 다른 많은 통계를 집계 한 후에 이것을 한 번 호출하는 것이다. 이것에 대한 한 가지 요청은 데이터를 준비하는 데 걸리는 시간과 거의 관계가 없습니다. 나는 이것을 일반 대중에게 공개 할 계획이 없다. –