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écoupage de vecteur pour former une matrice


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Par défaut Découpage de vecteur pour former une matrice
    Bonjour, je voudrai découper un vecteur d'entrée de taille variable en bout de 8192 pts. Et par la suite ajouter un décalage T entre ces chaque bouts de vecteurs.

    Ainsi le premier vecteur sera (1:8192) le deuxieme sera (1+T:8192+T) le troisieme (1+2T:8192+T) etc... et par la suite les transposés dans une matrice afin d'obtenir mes vecteur en lignes de la matrice.

    J'étais parti sur la fonction reshape, mais j'ai des problèmes au niveau du SIZE car comme mon entrée est variable elle n'est pas toujours divisible par 8192... Any idea ??

    Merci d'avance !

  2. #2
    Membre émérite
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Par défaut
    Tu peux essayer ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    clc
    L=8192;
    a=1:L*3+2;
    La=numel(a);
    a=vec2mat(a,L,NaN)';
    T=5;
    for i=1:size(a,2)
        a(:,i)=a(:,i)+T*(i-1);
    end
    a(1:5,:)

  3. #3
    Membre confirmé
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Par défaut
    Merci beaucoup c'est deja une bonne piste ! Car cependant lorsque je compile j'obtiens une matrice qui est différente de ce que je souhaite obtenir, par exemple ou T=5 j'obtiens:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     1    8198   16395   24592
           2    8199   16396   24593
           3    8200   16397      15
           4    8201   16398      15
           5    8202   16399      15
           6    8203   16400      15
           7    8204   16401      15
           8    8205   16402      15
           9    8206   16403      15
          10    8207   16404      15
          11    8208   16405      15
          12    8209   16406      15
          13    8210   16407      15
          14    8211   16408      15
    j’imagine que les deux autres colonnes sont la suite de la matrice, cependant on peut voir qu'après la ligne [16396 24593] les lignes suivantes passe le j à 15 et ce jusqu'a la fin, est ce un bug d'affichage ?

    Par ailleurs le les premiers résultats ne sont pas cohérents non plus car ils vont de [1+i : 8198+T+1] donc l'incrémentation du T n'est pas prise en compte sur le i de la matrice mais que sur le j j'ai l'impression.

    Enfin j'ai du mal à comprendre ce que tu fais dans la boucle for, pourquoi ne pas juste faire quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for i=1:size(a,2)
       for j=1:size(a,2)
    a(:,j)=a(:,j)+T
    a(i,;)=a(i,:)+T
       end
    end
    Je sais que le code ne marche pas mais l'idée est la... Et j'ai du mal à comprendre lorsque tu crées la matrice a, pourquoi ne pas la faire de a=1:L plutot que &=1:L+3*2 ??

    Merci en tout cas pour la réponse =)

  4. #4
    Membre confirmé
    Homme Profil pro
    Ecole d'ingénieur
    Inscrit en
    Avril 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ecole d'ingénieur

    Informations forums :
    Inscription : Avril 2014
    Messages : 80
    Par défaut
    J'ai compris pour la taille de la matrice a, par contre autre question, pour le calcul du floor, moi j'aurai plus vu ça de la forme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    floor((Longeur signal entrée -8192)/T)
    any idea ?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    230
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 230
    Par défaut
    Quand tu déclares une matrice, elle sera forcément de la taille m*n. Donc si le vecteur que tu tentes de mettre en forme ne peut pas être mis sous cette taille, ce ne sera pas directement possible.
    Par contre, tu peux initialiser une matrice (0, NaN, Inf,...), faire le reshape sur un nombre divisible par 8192, puis compléter avec le reste des éléments.
    Ci-joint un code avec un autre cas, essayes de l'adapter (voir optimiser car il y a moyen) en fonction de ton cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     A = zeros(5,10);
    tailleMat = size(A);
    nbEltMat = numel(A);
    B = rand(1,47);
    tailleVect = size(B);
    nbEltVect = numel(B);
    ind = floor(nbEltVect/ tailleMat(1));
    A(1: ind*tailleMat(1))= reshape(B(1:ind*tailleMat(1)), tailleMat(1), []);
    A(ind*tailleMat(1)+1 : ind*tailleMat(1)+(nbEltVect-ind*tailleMat(1))) = B(ind*tailleMat(1)+1: end)

  6. #6
    Membre émérite
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Par défaut
    J'ai modifié mon premier code et j'ai utilisé la fonction vect2mat.

    Je ne sais pas si j'ai compris ce que tu veux dire par "ajouter un décalage T entre ces chaque bouts de vecteurs".
    Est ce que tu veux ajouter (addition) à chaque colonne un T*i (i=0:nbre de colonne - 1) ?

Discussions similaires

  1. Un vecteur pour indexer une matrice 2D
    Par ERCO503 dans le forum MATLAB
    Réponses: 1
    Dernier message: 06/12/2013, 20h36
  2. Réponses: 11
    Dernier message: 20/07/2009, 11h22
  3. Réponses: 18
    Dernier message: 24/07/2006, 19h30
  4. Concaténation de deux integer pour former une clé primaire
    Par stoukou dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 08/09/2005, 10h34
  5. [LG] Problème pour afficher une matrice
    Par phoebee dans le forum Langage
    Réponses: 4
    Dernier message: 11/08/2005, 21h41

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