2017-05-29 1 views
-2

J'ai essayé d'utiliser des transformations homogènes sur C++ mais je ne peux pas faire fonctionner la multiplication matricielle. Est-ce que je fais quelque chose de mal dans le code? J'ai vérifié le faire à la main et il ne semble pas avoir tort. Ai-je manqué quelque chose?La multiplication de matrices peut fonctionner correctement

#include "stdafx.h" 
using namespace std; 

float point[3][1]; 
float point_trans[3][1] = {0,0,0}; 
float rot[3][3] = { {1,2,3},{4,5,6},{7,8,9} }; 
float d[3][1] = {0,0,0}; 
float x,y,z; 

float transform (float x1, float y1, float z1) 
{ 
    point[0][0] = x1; 
    point[1][0] = y1; 
    point[2][0] = z1; 

    for(int i=0; i<3; ++i) 
    { 
     for(int j=0; j<1; ++j) 
     { 
      for(int k=0; k<3; ++k) 
      { 
       point_trans[i][j]+=rot[i][k]*point[k][j]; 
      } 
     } 
    } 

    x1 = point_trans[0][0] + d[0][0]; 
    y1 = point_trans[1][0] + d[1][0]; 
    z1 = point_trans[2][0] + d[2][0]; 

    return(x1,y1,z1); 
} 

int main() 
{ 
    x = 6; y = 7; z = 8; 

for(int i=0;i<3;i++) 
{ 
    for(int j=0;j<3;j++) 
    { 
     cout << rot[i][j] << " "; 
    } 
    cout << endl; 
} 


    (x,y,z) = transform(x,y,z); 
    cout << "X:" << x << " " << "Y:"<<y<<" "<<"Z:"<<z<<endl; 
    system("pause"); 
    return 0; 

} 
+0

Veuillez prendre le temps de lire sur [comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+0

Quel résultat attendez-vous, et pourquoi, et quel résultat obtenez-vous, et si vous pensez que la multiplication matricielle est le problème, pourquoi ne pas l'isoler dans une fonction qui fait la multiplication matricielle et rien d'autre? – Beta

+0

Votre multiplication matricielle fonctionne bien ... mais vous ne pouvez pas renvoyer 3 valeurs dans cpp à partir d'une fonction. – Chandini

Répondre

0

Vous écrivez du code python en C++. Les parenthèses créent une instance d'un type composite (tuple) en python. La sortie sera 6, 7, 8 car elle retourne un résultat, mais ce résultat est un triplet de trois parties, et l'assignation de x, y, z = (6, 7, 8) assigne chaque partie du tuple à différentes variables parce que de comment python fait une tâche avec un tuple. Ce qui se passe réellement dans C++ lorsque vous écrivez (6, 7, 8) est l'opérateur virgule, qui évalue le premier élément et rejette le résultat. https://en.wikipedia.org/wiki/Comma_operator Les parenthèses regroupent les opérateurs et n'ont aucun effet ici. Parce que l'évaluation d'une seule valeur float comme "x" n'a aucun effet secondaire, elle ne fait rien, et "return (x, y, z)" dans le code C++ est la même chose que d'écrire "return z". Comme le code est C++, vous devez faire la même chose que le code python (retourner une valeur avec trois parties), mais vous devez le faire en C++, alors allez-y et déclarez un type. C'est l'une des différences clés - vous devez dire au compilateur quels sont les types. Il y a bien sûr plusieurs façons de le faire, mais vous ne pouvez pas utiliser la syntaxe python.

struct coordinate { float x, y, z; }; 

coordinate transform(float x1, float y1, float z1) 
{ 
    // code 
    return coordinate{ x1, y1, z1 }; 
} 

// in main 
coordinate result = transform(x, y, z); 
cout << "X:" << result.x << " " << "Y:" << result.y << " " << "Z:" << result.z << endl; 
+0

Merci! Ça a marché comme sur des roulettes. –