Своего рода определение" , когда два потока получают доступ к тому же местоположению в памяти одновременно, и по крайней мере один из доступов является записью ". В ситуации поток "читателя" может получить старое значение или новое значение, в зависимости от которого поток "выигрывает гонки". Это - не всегда bug— на самом деле некоторые действительно волосатые алгоритмы низкого уровня делают это на purpose— но этого нужно обычно избегать. Gury give's @Steve хороший пример того, когда это могла бы быть проблема.
Разложение по сингулярным значениям (см. Также этот блог и этот PDF ). Он превращает произвольную матрицу в композицию из 3-х матриц: ортогональных + диагональных + ортогональных. Ортогональные матрицы - это матрицы вращения; диагональная матрица представляет собой перекос по первичным осям = масштабирование.
Перевод добавляет в игру гаечный ключ, но что вам нужно сделать, так это убрать трансляционную часть матрицы, чтобы у вас была матрица 3x3, запустите SVD на ней чтобы дать вам вращение + наклон, затем снова добавьте часть перемещения. Таким образом у вас будет вращение + масштаб + вращение + преобразование композиции из 4 матриц. Вероятно, это можно сделать в 3-х матрицах (вращение + масштабирование по некоторому набору осей + перевод), но я не уверен, как именно ...
Yes, but the solution will not be unique. Also you should rather put translation at the end (the order of the rest doesn't matter)
For any given square matrix A
there exists infinitely many matrices B
and C
so that A = B*C
. Choose any invertible matrix B
(which means that B^-1 exists or det(B) != 0) and now C = B^-1*A
.
So for your solution first decompose MC
into MT
and MS*MR*MSk*I
, choosing MT to be some invertible transposition matrix. Then decompose the rest into MS
and MR*MSk*I
so that MS is arbitrary scaling matrix. And so on...
Now if at the end of the fun I
is an identity matrix (with 1 on diagonal, 0 elsewhere) you're good. If it is not, start over, but choose different matrices ;-)
In fact, using the method above symbolically you can create set of equations that will yield you a parametrized formulas for all of these matrices.
How useful these decompositions would be for you, well - that's another story.
If you type this into Mathematica or Maxima they'll compute this for you in no time.