Definire sottomatrice

di il
1 risposte

Definire sottomatrice

Aggiungo un'altra richiesta:
Ho una matrice con diverse colonne, e con diversi valori:
es.
1.16 -0.656 -1.526 1.16
1.2 -1.74 -0.671 1.2
1.24 -0.336 0.717 1.24
1.28 -0.412 9.153 1.28
1.32 1.358 0.656 1.32
1.36 -0.137 -0.153 1.36
6.4 0.778 -0.992 1.4
1.44 -1.175 -0.626 1.44
1.48 -0.732 0.305 1.48
1.52 -1.175 -1.175 1.52
1.56 2.824 1.297 1.56
1.6 -0.732 0.305 7.6
1.64 0.153 0.61 5.64
1.68 0.336 1.205 1.68
1.72 0.9 1.099 1.72

Per ogni colonna vorrei definire una sottomatrice che comprenda i 3 valori che precedono il valore massimo, il valore massimo ed i 3 valori successivi. Questo per ogni colonna.
Nell'esempio, quindi, la sottomatrice dovrebbe restituirmi:
1.28 -1.175 -1.526 1.48
1.32 -0.732 -0.671 1.52
1.36 -1.175 0.717 1.56
6.4 2.824 9.153 7.6
1.44 -0.732 0.656 5.64
1.48 0.153 -0.153 1.68
1.52 0.336 -0.992 1.72

Si può fare?
Ale

1 Risposte

  • Re: Definire sottomatrice

    La cosa si può fare e mi ricorda molto gli esercizi in C++ che facevo quando seguivo il corso di fondamenti di informatica all'università.
    
    % Supponiamo tu abbia gia definito la matrice iniziale che si chiama A.
    % Il secondo punto è trovare la posizione del massimo nella colonna, il suo indice.
    
    m   = max(A(:,1));           Trova il valore del massimo nella prima colonna
    pos = find(A(:,1)==m);     Trova la posizione del valore massimo
    
    % Crea la prima colonna della matrice di output che chiamerò B
    
    B=[A(pos-3,1); A(pos-2,1); A(pos-1;1); A(pos,1); A(pos+1,1); A(pos+2,1); A(pos+3,1)];
    
    Questo va fatto per ogni colonna.
    La cosa può essere resa automatica mediante il seguente ciclo for.
    
    
    % Abbiamo gia definito la matrice input chiamata A,
    % sia n il numero di colonne di A
    
    % Sia B la matrice di output desiderata.
    B=zeros(7,n);
    
    % Ciclo con tutte le operazione per trovare le colonne di B
    for i=1:n
    m   = max(A(:,i));
    pos = find(A(:,i)==m;
    
    B(:,i)=[A(pos-3,i); A(pos-2,i); A(pos-1;i); A(pos,i); A(pos+1,i); A(pos+2,i); A(pos+3,i)];
    end
    
    Ovviamente in questo caso perdi i massimi parziali di ogni colonna e alla fine dello script, m e pos conterranno valore e posizione del massimo dell'ultima colonna.
    Per salvare tutti i massimi e tutte le posizioni basta dichiarare m e pos non come singola variabile ma come vettore come scritto sotto.
    
    
    % Abbiamo gia definito la matrice input chiamata A,
    % sia n il numero di colonne di A
    
    % Sia B la matrice di output desiderata.
    B=zeros(7,n);
    
    % Siano m e pos i vettori che contengono tutti i massimi e tutte le posizioni parziali
    
    m   = zeros(n);
    pos = zeros(n);
    
    % le inizializzazioni di B, m e pos non sono fondamentali in MatLab (lo sono in altri linguaggi) ma ti consentono di avere un codice piu pulito e lineare e sopratutto comprensibile  anche da terze persone. Inoltre l'inizializzazione dei vettori usati poi in un ciclo consente di sveltire le operazioni di MatLab.
    
    % Ciclo con tutte le operazione per trovare le colonne di B
    for i=1:n
    m(i)   = max(A(:,i));
    pos(i) = find(A(:,i)==m;
    
    B(:,i)=[A(pos-3,i); A(pos-2,i); A(pos-1;i); A(pos,i); A(pos+1,i); A(pos+2,i); A(pos+3,i)];
    end
    
Devi accedere o registrarti per scrivere nel forum
1 risposte