PROGETTO MATLAB

di il
5 risposte

PROGETTO MATLAB

Salve,sono una studentessa di ingegneria biomedica,e avrei bisogno di un aiuto riguardante un progetto matlab per l'esame di Teoria dei Sistemi.Bisogna scrivere un programma di tipo function che estragga la diagonale principale da una matrice numerica e uno che costruisca una matrice diagonale con diagonale pari ad un vettore v=3 6 9.
Ringrazio in anticipo.

5 Risposte

  • Re: PROGETTO MATLAB

    Hai fatto almeno un tentativo per risolvere il problema? Dovresti pubblicare il codice che hai scritto.

    Hai un problema specifico?
    Hai provato a consultare la documentazione on-line?

    Si tratta di un compito estremamente semplice che si può risolvere in svariati modi, ad eempio

    [*] con una funzione dedicata di MatLab: ti basta cercare su Google "matlab diagonale matrice" ed il primo risultato presentato punta alla documentazione on-line della funzione che fa per te ()

    [*] sfruttando le proprietà di indexing di MatLab
    https://www.mathworks.com/company/newsletters/articles/matrix-indexing-in-matlab.html
    https://www.mathworks.com/help/matlab/learn_matlab/array-indexing.html

    considera che, se la matrice ha dimensione (n x n), e, se accedi ad essa tramite un solo indice (https://www.mathworks.com/help/matlab/math/array-indexing.html#d120e1301), gli elementi della diagonale saranno quelli con indice 1:n+1:n.^2

    [*] con due cicli for annidati:
    se i due cicli hanno come indici, rispettivamente "i" e "j", per la definizione di diagonale, gli elementi che cerchi saranno quelli in corrispondenza del verificarsi della condizione "i == j" (quindi dovrai usare un blocco "if")

    Per ulteriori informazioni:

    https://www.mn.uio.no/astro/english/services/it/help/mathematics/matlab/getstart.pdf
  • Re: PROGETTO MATLAB

    Ho provato questo codice per creare una matrice diagonale a partire da un vettore ma non va.

    function [D] = diagonale(x)
    for m=1:length(x)
    for n=1:length(x)
    if n==m
    D(m,n)=1
    else
    D(m,n)=0
    end
    end
  • Re: PROGETTO MATLAB

    Nel codice che hai pubblicato non è chiaro cosa sia il parametro "x" in input alla funzione.

    Se è uno scalare che definisce la dimensione della matrice, l'istruzione "length(x)" non ha senso perchè la "lunghezza di uno scalare è 1 e, quindi i cicli for eseguiranno una sola iterazione.

    Se, invece, è un vettore, non capisco come tu voglia utilizzarlo.

    Assumendo che sia uno scalare, devi modificare la definizione dei due loop sostituendo "lengrh(x)" con "x".
    Puoi anche semplificare il blocco "if" inizializzando a "0" la matrice prima dei loop ed eliminando la condizione "else"; questo ti consente anche, in caso di matrici molto grandi, di aumentare la velocità di esecuzione in quanto il codice non deve allocare la memoria per la matrice ad ogni iterazione.

    Nota, anche, che nel codice che hai pubblixato manca l'"end" che chiude il ciclo for esterno.
    
    D=zeros(x,x)
    for m=1:x
       for n=1:x
          if n==m
             D(m,n)=1
          end
       end
    end
    
    Come scritto nella risposta precedente, ci sono molti altri modi per risolve il problema. Ad esempio:

    Con la funzione "diag":
    
    D=diag(ones(x,1))
    
    
    Usando l'indexing ed accedendo alla matrice con un solo indice:
    
    D2=zeros(x,x)
    D2(1:x+1:x.^2)=1
    
  • Re: PROGETTO MATLAB

    Perfetto,ora va meglio,ho risolto,grazie. Per quanto riguarda invece la function per l'estrazione della diagonale principale da una matrice quadrata ho fatto così,ma non riesco a continuare:

    function [vet] = vettore(A)
    [r,c]=size (A);
    for i=1:r
    for j=1:c
    if i==j
    vet=( )
    end

    end
    end
  • Re: PROGETTO MATLAB

    Per inserire i valori della diagonale nel vettore usando dei loop, devi definire un "contatore" che verrà incrementato ogni volta che la condizione del blocco "if" sarà verificata.
    Questo contatore costituirà l'indice col quale accedi al vettore:
    
    [r,c]=size (A);
    % Definizione del contatore
    cnt=0;
    % inizializzatione del vettoe di output
    vet=nan(1,r)
    for i=1:r
       for j=1:c
          if i==j
             % Incremento del contatore
             cnt=cnt+1
             % assegnazione del valore al vettore nella posizione definita dal contatore
             vet(cnt)=A(i,j)
          end
       end
    end
    
    Come per la creazione della diagonale, ci sono soluzioni alternative all'uso dei cicli for:

    Usando la funzione "diag":
    
    vet=diag(A)
    
    Usando l'indexing:
    
    vet=A(1:r+1:r.^2)
    
Devi accedere o registrarti per scrivere nel forum
5 risposte