Archives du mot-clé MATLAB

MATLAB R2014a : amélioration des fonctions rot90, flipud et fliplr pour les tableaux 3D

La prise en charge de tableaux 3D par les fonctions rot90, flipud et fliplr est une des améliorations apportées par la dernière version R2014a de MATLAB. Celle-ci va rendre un service à ceux qui manipulent des images et qui ne possèdent pas l’Image Processing Toolbox.

La prise en charge des tableaux 3D va permettre de simplifier les codes pour faire pivoter une image en couleurs vraies (RGB par exemple) ou pour lui appliquer une transformation miroir.

Analysons ce changement avec l’image « ngc6543a.jpg » livrée avec toutes les versions de MATLAB :

>> I = imread('ngc6543a.jpg', 'jpg');
>> whos I
  Name        Size                 Bytes  Class    Attributes

  I         650x600x3            1170000  uint8

Avec MATLAB R2013b ou versions plus anciennes

Jusqu’à présent, il n’était pas possible d’appliquer directement les fonctions :

>> Ir = rot90(I);
Error using rot90 (line 21)
A must be a 2-D matrix.
 
>> Iflr = fliplr(I);
Error using fliplr (line 18)
X must be a 2-D matrix.
 
>> Ifud = flipud(I);
Error using flipud (line 19)
X must be a 2-D matrix.

Pour l’effet miroir avec fliplr et flipud, il est possible de travailler avec les indices :

>> Iflr = I(:,end:-1:1,:);
>> Ifud = I(end:-1:1,:,:);

Mais pour la rotation, il faut nécessairement décomposer l’image selon ses trois composantes et recomposer l’image à la fin :

>> I = imread('ngc6543a.jpg', 'jpg');
>> R = I(:,:,1);
>> G = I(:,:,2);
>> B = I(:,:,3);
>> Rr = rot90(R);
>> Gr = rot90(G);
>> Br = rot90(B);
>> Ir = cat(3, Rr, Gr, Br);
>> clear Rr Gr Br

ou plus directement :

>> I = imread('ngc6543a.jpg', 'jpg');
>> Rr = rot90(I(:,:,1));
>> Gr = rot90(I(:,:,2));
>> Br = rot90(I(:,:,3));
>> Ir = cat(3, Rr, Gr, Br);
>> clear Rr Gr Br

Tout ceci n’est pas très optimisé, nuit à la lisibilité du code et nécessite (temporairement) le double de quantité de mémoire.

Avec MATLAB R2014a

Avec les améliorations apportées par la R2014a, il suffit maintenant de faire :

>> I = imread('ngc6543a.jpg', 'jpg');
>> Ir = rot90(I);
>> Iflr = fliplr(I);
>> Ifud = flipud(I);

La lisibilité du code est clairement améliorée.

C’est nettement mieux !

Compatibilité descendante

Seul bémol, les codes développés avec la R2014a ne fonctionneront pas avec les versions plus anciennes.

Pour résoudre ce problème, vous pourrez utiliser la fonction verLessThan disponible depuis MATLAB R2007a.

Par exemple pour effectuer une rotation avec rot90 :

I = imread('ngc6543a.jpg','jpg');

if verLessThan('matlab', '8.3')
   
    Rr = rot90(I(:,:,1));
    Gr = rot90(I(:,:,2));
    Br = rot90(I(:,:,3));
    Ir = cat(3, Rr, Gr, Br);
   
    clear Rr Gr Br
   
else
   
    Ir = rot90(I);
   
end

Conclusion

La prise en charge des tableaux 3D par les fonctions rot90, fliplr et flipud était attendue de longue date. C’est chose faite.

Il faudra néanmoins prendre en compte la compatibilité descendante si vous comptez diffuser vos codes à des utilisateurs qui n’auraient pas encore migré vers la R2014a.

MATLAB Home : offrez-vous MATLAB R2014a à prix réduit pour vos développements perso

MATLAB Home

Avec la récente sortie de MATLAB R2014a, MathWorks propose une nouvelle licence : MATLAB Home

licence MATLAB Home

Vous pouvez maintenant acquérir MATLAB à prix réduit, pour vos développements perso, si cela fait partie de vos hobbies.

Ceux qui trouvent MATLAB trop cher continueront sans doute à se plaindre, et préfèreront toujours les alternatives gratuites comme Scilab ou GNU Octave (voire Python). On peut également entrevoir derrière cette touche de philanthropie, d’autres buts plus mercantiles pour MathWorks.

Néanmoins, en tant qu’utilisateur de MATLAB depuis plus de 10 ans, je ne peux que saluer cette initiative. On pourra juste lui reprocher d’arriver un peu tardivement comparée à d’autres (Mathematica, Maple…) mais, mieux vaut tard que jamais.

Coût

MATLAB sous la nouvelle licence Home coute 105 Euros HT (soit 126 Euros TTC) pour la France. Simulink ainsi que l’ensemble des Toolbox (à l’exception du MATLAB Compiler) sont disponibles au prix unitaire de 29 Euros HT (soit 35 Euros TTC)

Fonctionnalités

La licence MATLAB Home vous donne droit à la même version (R2014a) que les autres licences, sans aucun bridage. Seul le MATLAB Compiler n’est pas disponible, son utilisation est injustifiée dans le cadre de cette licence.

Plateformes prises en charge

La licence MATLAB Home est disponible sur Windows 32 et 64 bits, Linux 64 bits et Mac 64 bits.

Limitation

La licence MATLAB Home vous permet seulement d’utiliser MATLAB dans le cadre de vos développements perso, en amateur dans votre garage. Elle ne s’applique pas aux activités commerciales, de recherche, gouvernementales ou éducatives. Dans ce cas, vous devez utiliser une des licences dédiées à ces usages.

FAQ

Vous trouverez toutes les informations dans la FAQ : http://www.mathworks.fr/products/matlab-home/includes/faq.html

A quoi sert la fonction « length » de MATLAB ?

Je lis régulièrement des codes MATLAB où la fonction length est utilisée.

Pour ma part, je ne l’utilise jamais.

Pourquoi donc ?

La fonction « length »

Comme son nom l’indique la fonction length renvoie une longueur, dans le sens d’une dimension d’un tableau.

Pour un vecteur, c’est assez évident :

>> V = [1 9 4 8 7];
>> length(V)

ans =

     5

Mais qu’en est-il pour un tableau ?

Prenons un cas simple :

>> M = rand(4,3);
>> length(M)

ans =

     4

Permutons les dimensions du tableau :

>> M = rand(3,4);
>> length(M)

ans =

     4

Et oui, voici ce que dit la documentation :

[length] finds the number of elements along the largest dimension of an array

Le résultat correspond bien, dans les deux cas, au nombre d’éléments le long de la plus grande dimension du tableau.

Les fonctions similaires

Les autres fonctions permettant de récupérer des informations sur les dimensions d’un tableau sont :

  • size : nombre d’éléments selon une des dimensions du tableau
  • numel : nombre total d’éléments du tableau

C’est celles que j’utilise tout le temps car il n’y a pas d’ambiguïté dans les informations qu’elles renvoient.

A quoi sert donc la fonction « length » ?

Bien entendu, je comprends le fonctionnement de la fonction length comme dans l’exemple de la documentation :

>> Y = rand(2, 5, 17, 13);
>> length(Y)

ans =

    17

Mais je n’arrive pas à trouver une application où il serait utile de connaitre le nombre d’éléments présents le long de la plus grande dimension d’un tableau.

Si vous avez des idées, n’hésitez pas à les partager ;)