Come incrementare nome di una variabile?

di il
1 risposte

Come incrementare nome di una variabile?

Salve ragazzi ho tante matrici A1, A2, A3, ecc ecc della stessa dimensione e vorrei con il commando horzcat attaccarle in un unica matrice quindi
A=horzcat(A1,A1,A3,.....)
senza scriverle tutte, vorrei scrivere una A con qualcosa affianco che gli dica di incrementare il nome della variabile

grazie mille a tutti

1 Risposte

  • Re: Come incrementare nome di una variabile?

    Ci sono almeno due modi per risolvere il problema nel caso i nomi delle matrici abbiano una radice uguale (es. "a") seguita da un numero progressivo (dato l'intervallo 1 - 4, devono essere definite tutte e quattro le matrici "a1, a2, a3 e a4)

    Entrambi i metodi sono basati sull'utilizzo della funzione built-in "eval"
    help eval
    eval Execute string with MATLAB expression.
    eval(EXPRESSION) evaluates the MATLAB code in the string EXPRESSION.

    [OUTPUT1,...,OUTPUTN] = eval(EXPRESSION) returns output from EXPRESSION
    in the specified variables.

    Example: Interactively request the name of a matrix to plot.

    expression = input('Enter the name of a matrix: ','s');
    if (exist(expression,'var'))
    plot(eval(expression))
    end
    Il primo metodo concatena le matrici "direttamente" senza ricorrere alle funzioni built-in horzcat o vertcat.
    Date le matrici di input "a1, a2, a3 e a4", il metodo consiste nel generate la stringa

    A1=[a1 a2 a3 a4];

    da passare come input alla funzione "eval".

    Il secondo metodo, invece, utilizza le funzioni built-in horzcat o vertcat e consiste nella creazione della stringa

    A2=horzcat(a1,a2,a3,a4);

    da passare come input alla funzione "eval".

    IN entrambi i casi, le stringhe vengono costruite iterativamente all'interno di un ciclo for.

    Nello script in calce sono stati implementati i due metodi (la funzione "eval" è stata anche usata per la generazione delle matrici di input).
    % 
    % Definizione del nmero di matrici e creazione di "num_matr" (13) matrici di esempio
    % 
    num_matr=13;
    for i=1:num_matr
       eval(['a' num2str(i) '=magic(2)*i*3;'])
    end
    % 
    % Definizione della modalità di concatenazione
    % 
    concat_mode='horzcat';
    % concat_mode='vertcat';
    % 
    % Controllo della validità della modalità di concatenazione e definizione
    % della stringa "mode_str" usata per la concatenazione
    % 
    if(strcmp(concat_mode,'horzcat'))
       mode_str=' ';
    elseif(strcmp(concat_mode,'vertcat'))
       mode_str=';';
    else
       error(['Modalità di concatenazione matrici non riconosciuta: ' concat_mode])
    end
    % 
    % Definizione della radice del nome delle matrici da concatenare
    % 
    mat_name_root='a';
    % 
    % Definizione del nome della matrice output
    % 
    out_mat_name='A1';
    %
    %%%%%%%%%%%%
    % METODO 1 %
    %%%%%%%%%%%%
    %
    % Concatenazione diretta (senza utilizzo delle funzini built-in "horzcat",
    % "vertcat"
    % 
    % Inizializzazione della stringa di comando "cmd_str" da passare alla
    % funzione "eval"
    %
    cmd_str=[out_mat_name '=['];
    % 
    % Loop per la costruzinoe della stringa di comando "cmd_str"
    % 
    for i=1:num_matr
       cmd_str=[cmd_str, mat_name_root, num2str(i) mode_str];
    end
    % 
    % Completamento della stringa di comando "cmd_str"
    % 
    cmd_str=[cmd_str '];'];
    % 
    % Invocazione della funzione "eval" per l'esecuzione del comando definito
    % nella stringa di comando "cmd_str"
    % 
    disp('Metodo 1: concatenazione diretta');
    cmd_str
    eval(cmd_str)
    %
    %%%%%%%%%%%%
    % METODO 2 %
    %%%%%%%%%%%%
    % 
    % Concatenazione con l'utilizzo delle funzini built-in "horzcat", "vertcat"
    % 
    % Definizione del nome della matrice output
    % 
    out_mat_name='A2';
    %
    % Controllo della validità della modalità di concatenazione
    % 
    if(~(strcmp(concat_mode,'horzcat') || strcmp(concat_mode,'vertcat')))
       error(['Modalità di concatenazione matrici non riconosciuta: ' concat_mode])
    end
    % 
    % Inizializzazione della stringa di comando "cmd_str" da passare alla
    % funzione "eval"
    %
    cmd_str=[out_mat_name '=' concat_mode '('];
    % 
    % Loop per la costruzinoe della stringa di comando "cmd_str". Il loop non
    % considera l'ultima matrice per non inseriere la "," al termine della
    % stringa. Il nome dell'ultima matrice viene aggiunto alla stringa di
    % comando subito dopo il loop
    % 
    for i=1:num_matr-1
       cmd_str=[cmd_str, mat_name_root, num2str(i) ','];
    end
    % 
    % Completamento della stringa di comando "cmd_str"
    % 
    cmd_str=[cmd_str , mat_name_root, num2str(i+1) ');'];
    % 
    % Invocazione della funzione "eval" per l'esecuzione del comando definito
    % nella stringa di comando "cmd_str"
    % 
    disp(['Metodo 2: concatenazione con "' concat_mode '"']);
    cmd_str
    eval(cmd_str)
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte