Frage

EDIT:
After fixing the syntax error and working with this algorithm I found the MKL provider is not the matrix multiplication needed. This algorithm simply multiplies element by element and does not compute the dot(row_n,column_n) as I had originally thought.

other source

End Edit

I can't get this passed the compiler. I have looked all over for a good example but have come up short. The documentation I'm referencing is MklLinearAlgebraProvider

MathNet.Numerics.Algorithms.LinearAlgebra.Mkl.MklLinearAlgebraProvider

I'm trying to write a simple method to compute the rotation matrix R = rz*ry*rx from Euler angles. The problem is the compiler won't take ryXrx or resultMat arrays I'm trying to pass it. I've tried out keyword as well.

inputMat is a 1-D array of the form {x,y,z,rx,ry,rz} where x,y and z are translations and rx,ry and rz are rotation angles in degrees.

 private float[,] EulerToHMat(float[] inputMat)
    {
        var linalg = new MathNet.Numerics.Algorithms.LinearAlgebra.Mkl.MklLinearAlgebraProvider();

        double rzRad = ((double)inputMat[5])*Math.PI/180;
        double cosZ = Math.Cos(rzRad);
        double sinZ = Math.Sin(rzRad);

        double ryRad = ((double)inputMat[4])*Math.PI/180;
        double cosY= Math.Cos(ryRad);
        double sinY = Math.Sin(ryRad);

        double rxRad = ((double)inputMat[3])*Math.PI/180;
        double cosX= Math.Cos(rxRad);
        double sinX = Math.Sin(rxRad);



        var rz = new float[,] { { (float)cosZ, -(float)sinZ, 0 }, { (float)sinZ, (float)cosZ , 0 }, {0,0,1 } };

        var ry = new float[,] { { (float)cosY , 0 , (float)sinY }, { 0, 1 , 0 }, { -(float)sinY, 0, (float)cosY } };

        var rx = new float[,] { {1,0,0 }, {0,(float)cosX,-(float)sinX }, {0,(float)sinX,(float)cosX } };


        var ryXrx = new float[3,3];  
        var resultMat = new float[3, 3];

        // won't take the matrix --ryXrx-- here 
        linalg.MatrixMultiply(ry, 3, 3, rx, 3, 3,ryXrx);  

        // won't take the matrix --resultMat-- here 
        linalg.MatrixMultiply(rz, 3, 3, ryXrx, 3, 3,resultMat);


        return resultMat;

    }

This seems like it should be simple.... Please ignore the casting mess.

War es hilfreich?

Lösung

According to the reference you linked, the method works on matrices that are stored in a SINGLE-dimensional array, you are trying to pass two-dimensionals.

Try this:

var rz = new float[] {  (float)cosZ, -(float)sinZ, 0, (float)sinZ, (float)cosZ, 0, 0, 0, 1  };

var ry = new float[] {  (float)cosY, 0, (float)sinY,  0, 1, 0, -(float)sinY, 0, (float)cosY };

var rx = new float[] { 1, 0, 0, 0, (float)cosX, -(float)sinX, 0, (float)sinX, (float)cosX };

int size = 3;
var ryXrx = new float[size * size];  
var resultMat = new float[size * size];

// won't take the matrix --ryXrx-- here 
linalg.MatrixMultiply(ry, size, size, rx, size, size,ryXrx);  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top