p
u
b
l
i
c
i
t
é
publicité
  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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur R&D - Consultant MATLAB freelance
    Inscrit en
    novembre 2006
    Messages
    18 201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D - Consultant MATLAB freelance
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2006
    Messages : 18 201
    Points : 50 549
    Points
    50 549

    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 : Après GNU Octave 4.0.0, Scilab 6.0.0 se prépare à sortir

    Ma page personnelle avec mes contributions MATLAB (R2011b/R2015a - 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 : 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
    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.

Discussions similaires

  1. [DATA] Rassembler, grouper, sommer des sous variables
    Par avyperez dans le forum SAS Base
    Réponses: 1
    Dernier message: 18/02/2013, 17h54
  2. Bouger des sous-matrices dans une matrice
    Par DJEcalcul dans le forum MATLAB
    Réponses: 4
    Dernier message: 16/03/2012, 17h31
  3. Réponses: 2
    Dernier message: 08/10/2010, 11h54
  4. reconnaissance des sous-matrices de zéros
    Par Lalaine dans le forum Mathématiques
    Réponses: 2
    Dernier message: 16/03/2009, 16h01
  5. Liste des sous-matrices carrées
    Par potimarara dans le forum Général Algorithmique
    Réponses: 8
    Dernier message: 12/10/2006, 18h30

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