Transposée de matrice algo?

Signaler
Messages postés
15
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
16 juillet 2008
-
luhtor
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
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
A voir également:

7 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
14
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
Messages postés
15
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
16 juillet 2008

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.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
15
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
16 juillet 2008

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; 
}
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
14
Le principe que je t'ai donnée ne fonctionnait que dans le cas de matrice carré.
Messages postés
15
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
16 juillet 2008

En effet,

Merci quand même

D'autres proposition?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.