Transposée de matrice algo?

cs_YOOP Messages postés 15 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 16 juillet 2008 - 16 juil. 2008 à 09:59
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 16 juil. 2008 à 21:56
Bonjour,

Le contexte :
-------------
Je travaille sur un programme embarqué en C sur PIC (µC). (Compilateur MCC18 du constructeur)
Je suis soucieux de la rapidité de traitement de l'opération ainsi que d'éviter un stack overflow.... La taille de la matrice étant 6*10...

Les critères :
-------------
Un algorithme qui réalise la transposée d'une matrice... Simple sauf si :
Je cherche a le faire (sans savoir si c'est possible) sur un même espace mémoire... c'est a dire sur une seul matrice! Donc, pas de :
for(i)
for(j)
matrice1[j][i]=matrice_source[i][j].

Avez-vous déjà vu,entendu parler de ce genre d'algo?

D'avance je vous remercie,

YOOP

7 réponses

cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
16 juil. 2008 à 11:50
Bonjour vu que ta matrice n'est pas carré ca risque d'être du de faire ça sur le même espace mémoire.
Sinon tu peux essaye de faire un
for (i=0; ...
    for j= i + 1
      a = matrice[i][j]
      b = matrice[j][i]
      matrice[i][j] = b
      matrice[j][i] = a

Cdt
0
cs_YOOP Messages postés 15 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 16 juillet 2008
16 juil. 2008 à 13:28
Re,

En fait j'y avait pensé, mais cela ne fonctionne pas ...
si on a :
[1    2   3   4]
[11 12 13 14]
[21 22 23 24]
[31 32 33 34]
[41 42 43 44]
[51 52 53 54]

cela devient:
[1 11 21 31 2 12]
...

et non :
[1 11 21 31 41 51]
....

Merci quand même.

Si il a d'autre solution je reste preneur!

YOOP.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 juil. 2008 à 13:33
La suggestion de Laurent est correct. Ce qui ne l'est pas, c'est ton code. Faut pas travailler avec un tableau 2D, mais 1D et calculer toi meme la position des coefficients. En faisant la transposée, tu changes la forme du tableau, or c'est impossible de faire ca à la compilation.
0
cs_YOOP Messages postés 15 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 16 juillet 2008
16 juil. 2008 à 14:10
Bonjour Luhtor,

A moins que je me sois mal exprimé ou que je me suis fait mal comprendre voir que je n'ai pas donné suffisamment de précision, c'est possible!
typedef union
{
unsigned char tab1[6][10];
unsigned char tab1[10][6];
}==>C'est deux tableau occupent le même espace mémoire et ont la même taille en mémoire...

Ceci pour l'acces au même espace mémoire, mais de façon différente.

Sinon, pour réaliser la transposée, je l'aurait fait avec des pointeurs.. sur qui mon compilateur ne fait pas de contrôle...

Voici le code que j'ai testé : (peut-être m'y suis-je mal pris?)

void test(void)
{
/*Pour inverser matrice non carré sur un mm espace mémoire PAS OK*/
    signed char a,b;
    int i,j;
    static signed char matrice[6][4]=
        {
            {1,2,3,4},
            {11,12,13,14},
            {21,22,23,24},
            {31,32,33,34},
            {41,42,43,44},
            {51,52,53,54}       
        };       
for (i=0; i<6;i++)
    for(j= i + 1;j<4;j++)
    {
      a = matrice[i][j];
      b = matrice[j][i];
      matrice[i][j] = b;
      matrice[j][i] = a;
    }
    a=0; 
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
16 juil. 2008 à 14:18
Le principe que je t'ai donnée ne fonctionnait que dans le cas de matrice carré.
0
cs_YOOP Messages postés 15 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 16 juillet 2008
16 juil. 2008 à 14:23
En effet,

Merci quand même

D'autres proposition?
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
16 juil. 2008 à 21:56
Ah oui autant pour moi, je n'avais pas penser au union pour ca.


J'ai réfléchi à ton pb un petit quart d'heure, et c'est finalement loin
d'etre évident. La solution existe surement. Qd on regarde ca sur
papier on voit des enchainements de permutations mais difficile
d'étendre le truc à un cas général.
0
Rejoignez-nous