IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

[Débutant] Soustraction d'un vecteur à une matrice


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Par défaut [Débutant] Soustraction d'un vecteur à une matrice
    Bonjour à tous,

    Je suis nouveau dans le monde de Matlab. J'utilise davantage R pour le calcul matriciel et je souhaite faire simplement :

    matrice - vecteur ... sous R c'est possible, le vecteur est soustrait à chaque ligne ou à chaque colonne selon.

    Comment faire ça sous matlab ? je ne vois pas l'interet de dupliquer mon vecteur pour avoir les mêmes dimenstions...

    Merci bien !

    Choupi

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Quatre possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    M=[1 2
        3 4
        5 6]
     
    X=[4 6]
     
    for n=1:size(M,1)
       M(n,:)=M(n,:)-X;
    end
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    M=[1 2
        3 4
        5 6]
     
    X=[4 6]
     
    M=M-repmat(X,size(M,1),1);
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    M=[1 2
        3 4
        5 6]
     
    X=[4 6]
     
    M=reshape(cell2mat(arrayfun(@(n){M(n,:)-X},1:size(M,1))),size(M,2),[]).'
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    M=[1 2
         3 4
         5 6]
     
     X=[4 6]
     
    M = bsxfun(@minus, M, X)
    Pour le choix, tout dépend de la taille de la matrice à traiter et si on veut conserver un code lisible ou pas

  3. #3
    Membre expérimenté
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Par défaut
    Merci c'est exactement ça.

    Je vais faire des tests pour voir ce qui est le plus rapide. Pour le moment j'utilise une boucle.

    Encore merci,

    Choupi

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Il est également possible d'utiliser un fichier MEX, voici l'idée :

    Le code C, test.c:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include "mex.h"
     
    void mexFunction( int nlhs, mxArray *plhs[],
                      int nrhs, const mxArray *prhs[])
    {
    int i, j, m ,n;
    double *M, *X, *P;
     
    m = mxGetM(prhs[0]);
    n = mxGetN(prhs[0]);
     
    M = mxGetPr(prhs[0]);
    X = mxGetPr(prhs[1]);
     
    plhs[0] = mxCreateDoubleMatrix(m, n, mxREAL);
     
    P = mxGetPr(plhs[0]);
     
    j=0;
    for (i = 0; i < m*n; i++) 
        {
        j = (i / m);     
        P[i]=M[i]-X[j];
        }
    }
    A compiler avec MEX :Et à utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    M=[1 2
        3 4
        5 6]
     
    X=[4 6]
     
    P=test(M,X)
    Note : c'est l'idée qui est présenté ici.

    Après quelques tests rapides sur les différentes méthodes, je dirais que les deux meilleures sont BSXFUN et MEX

  5. #5
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2007
    Messages : 27
    Par défaut autre solution possible
    La solution suivante marche aussi. Je soupçonne que ce soit la plus rapide.

    M - ones(3,1) * X


    On peut bien sûr remplacer le 3 par size(M,1).

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par navhpf Voir le message
    Je soupçonne que ce soit la plus rapide.
    As-tu fais des tests avec des matrices de grandes dimensions ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutants] obtenir les dimensions d'une matrice
    Par roro_la_patate dans le forum C++
    Réponses: 9
    Dernier message: 19/05/2008, 15h14
  2. Réponses: 3
    Dernier message: 13/09/2007, 18h26
  3. Réponses: 11
    Dernier message: 11/09/2007, 12h25
  4. Réponses: 1
    Dernier message: 24/05/2007, 14h46
  5. [Débutant] Calculer le déterminant d'une matrice
    Par v4np13 dans le forum Mathématiques
    Réponses: 7
    Dernier message: 30/05/2005, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo