質問

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.

役に立ちましたか?

解決

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);  
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top