Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 105
    Points : 127
    Points
    127

    Par défaut Sommer des sous-elements de matrice

    Bonjour,

    Voila mon probleme:

    Soit une liste de numeros de ligne: Lines de taille L*1
    Soit une liste de numeros de colonnes: Columns de taille L*1
    Soit une matrice M de taille m*n, m>L
    Soit un indice i

    J'aimerais extraire de M une nouvelle matrice de taille L*1 dont les elements sont la somme des colonnes "i -> Columns(J) pour chaque J" de M. En d'autres termes, si:

    Code :
    1
    2
    3
    4
    M = [1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9; 1 2 3 4 5 6 7 8 9]
    Lines = [1;3] % ne considerer que les lignes 1 et 3 de M
    Columns = [3; 5] % sommer jusqu'a la colonne 3 de la ligne 1, et la colonne 5 de la ligne 3
    i = 2 % mais sommer seulement depuis la colonne 2
    =>
    Code :
    sum( [ 2 3; 2 3 4 5 ], 2 ) = [5; 14]
    En gros j'aimerais une generalisation de l'indexage M(Line, i:Column) suivi d'une somme, avec Line et Column non scalaires. Line peut facilement devenir un vecteur, mais je n'ai pas l'impression que c'est possible avec Column, de sorte a extraire des lignes de taille differentes (ou de meme taille mais comblees par des zeros).

    Une idee?

    Je vous remercie d'avance.

  2. #2
    Futur Membre du Club
    Inscrit en
    mars 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 36
    Points : 16
    Points
    16

    Par défaut

    Rien de plus simple :

    1) D'abord, récupère les données de la matrice qui vont être traités dans une nouvelle matrice en écrasant une matrice de zeros que tu dois créer au préalable avec la fonction zeros(l,c) avec l et c lignes et colonne de ta matrice de départ que tu obtiens facilement avec .

    ex :
    Code :
    1
    2
    3
    [l c] = size(Matrice)
    Matrice_sum_avec_zeros_initial = zeros(l,c) 
    Matrice_zeros_avec_zeros_initial(Numero_ligne_start:Numero_ligne_end,Numero_colonne_start:Numero_colonne_end) = Matrice(Numero_ligne_start:Numero_ligne_end,Numero_colonne_start:Numero_colonne_end)
    La tu dois avoir une matrice de zeros de taille matrice de départ avec au indice les éléments de matrice initial.

    Rappel :
    L'indexage Matrice :
    Code :
    M_new = M(Numero_ligne_start:Numero_ligne_end,Numero_colonne_start:Numero_colonne_end)

    Un coup de fonction sum et c'est fini.


    Après, la fonction sum qui peut à peu près tout faire niveau somme matriciel et qui te retourne un vecteur ligne (si ta matrice est 2D) donc chaque élément est la somme de chaque colonne. C'est d'après ce que j'ai compris exactement ce que tu veux faire.

    Code :
    Vecteur_finale = sum(Matrice_sum_avec_zeros_initial)
    PS : Genre sommer les éléments de la ligne 2 à 3 pour la colonne 4
    sum(M(2:3,4))


    Voila, bon courage.

  3. #3
    Membre habitué
    Inscrit en
    novembre 2003
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 105
    Points : 127
    Points
    127

    Par défaut

    Cher Vince,

    Le probleme est malheureusement un peu plus complique.

    Je dois sommer horizontalement le contenu des lignes d'une matrice M, depuis un index fixe (jusque la pas de probleme), mais jusqu'a un index de colonne qui DEPEND de la ligne. Toute la difficulte reside la: j'ai un vecteur qui contient les indices des lignes qui m'interessent, effectivement je pourrais faire:

    Code :
    1
    2
    lines = 2:3;
    sum( M(lines, ...),2 )
    pour ne sommer que les lignes d'interet. Je ne dois toutefois pas sommer l'integralite des colonnes, mais seulement depuis un indice i et jusqu'a un autre indice J different pour chaque ligne. Soit:

    Code :
    1
    2
    sum( [ M(lines(1), i:J(1) ) ; M(lines(2), i:J(2) ; ... ] , 2)
    Avec dans ce pseudo code le probleme evident que les lignes n'ont pas la meme taille et qu'il faudrait combler par des zeros.

    Et j'esperais qu'il existait une methode propre et efficace sans faire de boucles.

    Qu'en penses-tu?

    Merci

  4. #4
    Dut
    Dut est déconnecté
    Rédacteur/Modérateur

    Avatar de Dut
    Homme Profil pro Jérôme Briot
    Ingénieur hospitalier
    Inscrit en
    novembre 2006
    Messages
    17 791
    Détails du profil
    Informations personnelles :
    Nom : Homme Jérôme Briot
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 17 791
    Points : 49 561
    Points
    49 561

    Par défaut

    Citation Envoyé par smikar Voir le message
    Et j'esperais qu'il existait une methode propre et efficace sans faire de boucles.
    Quel est le problème avec les boucles ici ?
    Y-a-t-il une raison objective nécessitant de s'en passer ?
    Sur mon blog : Installer GNU Octave 3.8.1 sur Linux Xubuntu 14.10

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2014b - Windows, Linux et Mac) et Hardware

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Futur Membre du Club
    Inscrit en
    mars 2010
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 36
    Points : 16
    Points
    16

    Par défaut pas de solution

    Dans ce cas il n'y a pas de solution matricielle toute faite effectivement. Il faut une boucle For. Une seul suffit pour balayer les colonnes.

    Tiens, voici un code tout fait qui somme les colonnes d'une matrices avec vecteur des indices début ligne et vecteurs des indice fin ligne. J'ai cru comprendre que ton vecteur début d'indice est constant mais la tu peux mettre ce que tu veux. Si il y a un problème avec les indices normalement le code te le dit.....

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    clear all;clc;close all
    Matrice_de_depart = meshgrid(1:10);
    
    [l c] = size(Matrice_de_depart);
    Vecteur_J_fin_ligne = [1:c]; % exemple d'indice fin de boucle.
    Indice_debut_ligne = 3*ones(1,c); % Peut contenir des valeurs supérieures à Vecteur_J_fin_ligne.
    Vecteur_somme = [];
    if ~isempty(find(Vecteur_J_fin_ligne>c))|| ~isempty(find(Vecteur_J_fin_ligne>c))
        'Problème : Indice supérieur au nombre de ligne'
    elseif length(Vecteur_J_fin_ligne)~=c || length(Indice_debut_ligne)~=c
        'La longueur des vecteurs indices n''est pas égale aux nombres de colonnes de Matrice_de depart'
    else
        
        for i=1:c
            Vecteur_somme(i) = sum(Matrice_de_depart(Indice_debut_ligne(i):Vecteur_J_fin_ligne(i),i));
        end
        Matrice_de_depart
        Indice_debut_ligne
        Vecteur_J_fin_ligne
        Vecteur_somme
    end

    Si tu veux ignorer une colonne, tu mets une valeur d'indice fin ligne inférieur à indice début ligne ou un 0 directement. Dans ce cas, un 0 est retourné. Lance le code,....il y en a.

    Copie colle ce bout de code dans le workspace diretement et entrer...

    Bonne continuation.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •