Port fix from 2.0 to trunk. Problem discovered thanks to Jern-Kuan.
This commit is contained in:
parent
0eb7c3eb71
commit
897cc78397
|
@ -194,14 +194,26 @@ inline __device__ __host__ float lengthSquared(float3 a)
|
|||
}
|
||||
|
||||
|
||||
|
||||
// Use power method to find the first eigenvector.
|
||||
// http://www.miislita.com/information-retrieval-tutorial/matrix-tutorial-3-eigenvalues-eigenvectors.html
|
||||
inline __device__ __host__ float3 firstEigenVector( float matrix[6] )
|
||||
{
|
||||
// 8 iterations seems to be more than enough.
|
||||
|
||||
float3 v = make_float3(1.0f, 1.0f, 1.0f);
|
||||
float3 row0 = make_float3(matrix[0], matrix[1], matrix[2]);
|
||||
float3 row1 = make_float3(matrix[1], matrix[3], matrix[4]);
|
||||
float3 row2 = make_float3(matrix[2], matrix[4], matrix[5]);
|
||||
|
||||
float r0 = dot(row0, row0);
|
||||
float r1 = dot(row1, row1);
|
||||
float r2 = dot(row2, row2);
|
||||
|
||||
float3 v;
|
||||
if (r0 > r1 && r0 > r2) v = row0;
|
||||
else if (r1 > r2) v = row1;
|
||||
else v = row2;
|
||||
|
||||
//float3 v = make_float3(1.0f, 1.0f, 1.0f);
|
||||
for(int i = 0; i < 8; i++) {
|
||||
float x = v.x * matrix[0] + v.y * matrix[1] + v.z * matrix[2];
|
||||
float y = v.x * matrix[1] + v.y * matrix[3] + v.z * matrix[4];
|
||||
|
@ -215,6 +227,7 @@ inline __device__ __host__ float3 firstEigenVector( float matrix[6] )
|
|||
return v;
|
||||
}
|
||||
|
||||
|
||||
inline __device__ bool singleColor(const float3 * colors)
|
||||
{
|
||||
#if __DEVICE_EMULATION__
|
||||
|
@ -316,12 +329,23 @@ inline __device__ float3 bestFitLine(const float3 * colors, float3 color_sum, fl
|
|||
return firstEigenVector(covariance);
|
||||
}
|
||||
|
||||
|
||||
// @@ For 2D this may not be the most efficient method. It's a quadratic equation, right?
|
||||
inline __device__ __host__ float2 firstEigenVector2D( float matrix[3] )
|
||||
{
|
||||
// @@ 8 iterations is probably more than enough.
|
||||
|
||||
float2 v = make_float2(1.0f, 1.0f);
|
||||
const float3 row0 = make_float2(matrix[0], matrix[1]);
|
||||
const float3 row1 = make_float2(matrix[1], matrix[2]);
|
||||
|
||||
float r0 = lengthSquared(row0);
|
||||
float r1 = lengthSquared(row1);
|
||||
|
||||
float2 v;
|
||||
if (r0 > r1) v = row0;
|
||||
v = row1;
|
||||
|
||||
//float2 v = make_float2(1.0f, 1.0f);
|
||||
for(int i = 0; i < 8; i++) {
|
||||
float x = v.x * matrix[0] + v.y * matrix[1];
|
||||
float y = v.x * matrix[1] + v.y * matrix[2];
|
||||
|
|
Loading…
Reference in New Issue
Block a user