홈>
System.Windows.Media에서 Matrix를 사용하려고하는데 이해할 수없는 한계를 발견했습니다.
사례 1 :
double m11 = 0.0000001, // 1E-07
m12 = 0,
m21 = 0,
m22 = 0.0000001; // 1E-07
var mat = new Matrix(m11, m12, m21, m22, 0, 0);
var det = mat.Determinant; // det = 9.9999999999999988E-15 <==> m11*m22-m12*m21 = 1E-07 * 1E-07 = 1E-14
if (mat.HasInverse) // true
mat.Invert(); // OK
이 첫 번째 사례에서 우리는 모두 좋은 것 같습니다!
사례 2 :
double m11 = 0.00000001, // 1E-08
m12 = 0,
m21 = 0,
m22 = 0.0000001; // 1E-07
var mat = new Matrix(m11, m12, m21, m22, 0, 0);
var det = mat.Determinant; // det = 9.9999999999999988E-16 <==> m11*m22-m12*m21 = 1E-08 * 1E-07 = 1E-15
if (mat.HasInverse) // false
mat.Invert(); // KO : System.InvalidOperationException: 'Transform is not invertible.'
그러나이 두 번째 경우에는 행렬이 정사각형이고 행렬식이 0과 다른지 확인하지만 HasInverse는 false이고 Invert는 예외를 throw 할 수 있습니다. 내가 볼 수있는 유일한 차이점은 계산 1E-15 동안 필요한 정밀도입니다. 그러나 Matrix는 double을 사용하는 것으로 보이며 64 비트의 System.Double 정밀도는 다음을 사용해야합니다.
values ranging from negative 1.79769313486232e308 to positive 1.79769313486232e30
왜? 도움이 될만한 메시지를 보내 주셔서 감사합니다!
- 답변 # 1
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- JavaScript 변수를 HTML div에 '출력'하는 방법
- python - 문자열에서 특정 문자 제거
행렬 클래스 DOES는 double을 사용합니다. 여기에서 소스 코드를 확인할 수 있습니다.
(여기서 _m11 등은 모두
double
입니다. )다음 코드는 "동일 결과!"를 인쇄하여 계산과
Matrix.Determinant
간에 차이가 없음을 나타냅니다. :HasInverse
의 구현을 보면 역수가 없다는 이유에 대한 대답 :와이즈 비즈 따라서 구현됩니다 (현재 상황을보다 명확하게하기 위해 이것을 단순화했습니다) :
이 경우public static bool IsZero(double value) { return Math.Abs(value) < 2.22044604925031E-15; }
value
입니다1E-15
보다 적은 그래서2.22044604925031E-15
DoubleUtil.IsZero()
를 반환 따라서true
Matrix.HasInverse
를 반환 .false