2017-08-25 1 views
0

J'ai besoin d'effectuer des opérations de la matrice dans Android, donc j'ai cherché sur le renderScript, et je me suis useful information hereUtilisation de RANSScript Intrinsic BLAS pour effectuer des opérations matricielles dans Android mais j'ai obtenu un mauvais résultat?

J'ai essayé le programme dans la réponse ci-dessus comme ceci:

private void compute(){ 
    mRs = RenderScript.create(this); 

    Type.Builder builder = new Type.Builder(mRs, Element.U8(mRs)); 
    Type a_type = builder.setX(3).setY(2).create(); 
    Type b_type = builder.setX(3).setY(2).create(); 
    Type c_type = builder.setX(2).setY(2).create(); 
    Allocation A = Allocation.createTyped(mRs, a_type); 
    Allocation B = Allocation.createTyped(mRs, b_type); 
    Allocation C = Allocation.createTyped(mRs, c_type); 

    A.copyFrom(new byte[]{1, 2, 3, 1, 2, 3}); 
    B.copyFrom(new byte[]{1, 1, 1, 0, 1, 0}); 

    ScriptIntrinsicBLAS BLAS = ScriptIntrinsicBLAS.create(mRs); 
    BLAS.BNNM(A, 0, B, 0, C, 0, 1); 

    byte[] result = new byte[]{1,2,3,4}; 
    C.copyTo(result); 

    for(int i = 0; i < result.length; ++i){ 
     Log.i(TAG, i + " " + result[i]); 
    } 
} 

Mon fichier gradle est comme ça suivant:

targetSdkVersion 25 
renderscriptTargetApi 25 
renderscriptSupportModeEnabled true 
renderscriptSupportModeBlasEnabled true 

Mais j'ai les mauvais résultats que tous les éléments de la matrice C est égal à zéro:

08-25 16:31:05.384 30771-30771/cn.jy.testsiblas I/tag: 0 0 
08-25 16:31:05.384 30771-30771/cn.jy.testsiblas I/tag: 1 0 
08-25 16:31:05.384 30771-30771/cn.jy.testsiblas I/tag: 2 0 
08-25 16:31:05.384 30771-30771/cn.jy.testsiblas I/tag: 3 0 

Quelqu'un sait comment résoudre ce problème?

D'ailleurs, je viens de trouver, il semble y avoir de limitation dans les dimensions de la matrice qui peuvent être traitées avec ScriptIntrinsicBLAS? here is a question about this Quelqu'un sait-il à propos de cette limitation? Si la limitation est réelle, je crains de devoir trouver une autre façon de gérer les opérations matricielles sur Android.

+0

Vous ne pouvez pas multiplier 3x2 par un autre 3x2, la 2ème matrice doit être 2x3. – sakridge

+0

@sakridge Merci pour votre réponse. Mais la fonction BNNM exécute une opération matricielle comme ceci: C = A * Transpose (B), [document API ici] (https://developer.android.com/reference/android/renderscript/ScriptIntrinsicBLAS.html). donc les dimensions de chaque matrice sont correctes. Sinon, une exception sera levée si l'opération ne peut pas être effectuée. – Yuan

Répondre

0

Il est à cause de cela des docs: Calculations are done in 1.10.21 fixed-point format for the final output, just before there's a shift down to drop the fractional parts.

Ainsi, toute valeur calculée est inférieure à 2^21 (~ 2 millions) seront déplacées en dehors du réponse.

Si vous voulez faire des calculs sur les nombres dans cette gamme, vous devez changer vos valeurs dans les bits de poids fort de l'entrée.

+0

Merci pour votre aide généreuse! J'ai résolu mon problème sous votre direction! Le BNNM va décaler le nombre 21 bits avant la sortie, nous pouvons le corriger si je le décale comme ça. 'BLAS.BNNM (A, 0, B, 0, C, 0, 1 << 21); 'Finalement, j'ai obtenu le bon résultat. – Yuan