Memorizzare Vettori Indicizzandoli

di il
8 risposte

Memorizzare Vettori Indicizzandoli

Ciao,
premesso che sono nuovissimo e ho basi informatiche pessime, sto facendo una simulazione in cui ho bisogno di salvare in ogni punto di un reticolo un vettore. Se può servire il mio obiettivo è quello di simulare un cristallo nematico con un algoritmo di Metropolis, quindi devo ruotare uno alla volta dei vettori (versori) che sono localizzati nei punti reticolari. La mia idea è stata di generare una matrice in 3-D ed ad ogni punto di questa matrice associare un vettore con questa function:

function [v] = nematic(i,j,k, L )
v = [0; 0; 0];
N = length(L);
v = [L(i, j, k); rand(1); 0];
while (v(1)^2+v(2)^2) > 1
    v = [L(i, j, k); rand(1); 0];
end
v(3) = sqrt(1-(v(1)^2+v(2)^2));
end            

Visto che ad ogni passo io devo girare un vettore e lasciare gli altri come prima, ho bisogno di memorizzarli tutti in qualche modo in base ai tre indici della matrice NxNxN, ma non so come. Qualcuno ha un aiuto da darmi?
Grazie mille,
Matteo.

8 Risposte

  • Re: Memorizzare Vettori Indicizzandoli

    La domanda non è molto chiara, per il momento ho più domande che risposte:

    [*] la funzione nematic viene chiamata all'interno di un loop? Se sì sarebbe opportuno che pubblicassi anche quella porzione di codice
    [*] quale variabile vuoi memorizzare? Il vettore v
    [*] analizzando il codice che hai pubblicato:

    - gli indici i, j e k passati in input vengono usati solo per identificare un elemento della matrice L anche essa in input.
    Tanto vale passare alla funzione direttamente L(i,j,k)
    - la variabile N non viene utilizzata
    - nel ciclo while l'unico elemento che cambia ad ogni iterazione è il numero random generato da rand(1); non conosco il valore di L(i,j,k), ma se dovesse essere >= 1 il ciclo while sarebbe infinito
    - stando così le cose, il ciclo while non sembra necessario, il valore di v(2) potrebbe essere direttamente v(2)=sqrt(1-v(1)^2).

    Dovresti, per favore, chiarire maggiormente la domanda

    Hope this helps.
  • Re: Memorizzare Vettori Indicizzandoli

    Si mi rendo conto di non essere stato chiaro. Allora per evitare di fare ancora confusione semplifico di molto la mia domanda, in modo da (credo) rendere superfluo rispondere alle tue ed andare direttamente al punto. Il mio obbiettivo è di creare una matrice NxNxN (N ovviamente sarà un mio input) i cui elementi invece che essere dei numeri sono dei vettori di uno spazio euclideo a tre dimensioni. E' possibile?
    Ovviamente se ti sembra meno chiaro ancora ti rispondo alle domande, era solo per guadagnare tempo.
    Grazie mille.
  • Re: Memorizzare Vettori Indicizzandoli

    Mi dispiace, ma non sono ancora sicuro di avere capito che tipo di matrice vuoi creare.

    Mi sembra di capire che la la matrice (NxNxN) rappresenti, in qualche modo una serie di punti che definiscono un cubo.

    Ad ogni punto vuoi associare 3 valori (i coseni direttori del vettore con origine in quel punto).

    E' così?

    Hope this helps.

    Errata corrige
    Nella risposta precedente:

    v(2)=sqrt(1-v(1)^2)*rand(1)

    invece di v(2)=sqrt(1-v(1)^2)
  • Re: Memorizzare Vettori Indicizzandoli

    Esatto intendo proprio questo.
  • Re: Memorizzare Vettori Indicizzandoli

    OK, forse ci siamo.

    Ci sono molte possibilità, molto dipende da come vuoi gestire la matrice (N,N,N) e qual è il suo contenuto.

    Supponendo che le inforrmazioni sul vettore siano 3 (i coseni direttori):

    [*] Una possibilità potrebbe essere definire una matrice data(3,N.N.N).
    [*] Una seconda possibilità potrebbe essere utilizzare una matrice di strutture

    Potresti definire una matrice di strutture data(N,N,N) con una serie di campi, ad esempio:

    vettore: potrebbe essere un array (1x3) contenente i dati del vettore
    info: potrebbe essere una stringa di testo che contiene informazioni sul vettore associato allo (i,j,k)-esimo elemento della struttura.

    In questo modo la matrice di strutture(N,N,N) "assomiglia" ad una matrice (N,N.N) e non hai lo svantaggio di usare una "dimensione" aggiuntiva" come nel caso della prima soluzione.
    Non solo il ruolo della quarta dimensione è svolto dal campo "vettore", ma puoi avere "più" dimensioni, aggiungendo altri campi
    % definizione del parametro dimensionante la struttura
    N=2;
    % Inizializzazi0ne dell'aray strutture
    data(N,N,N).v=[0 0 0];
    data(N,N,N).info='';
    % Esempio di riempimento dell'array di strutture
    for i=1:N
       for j=1:N
          for k=1:N
             % Inserimento di valori numerici nel campo "vettore"
             data(i,j,k).vettore=rand(1,3);
             % Inserimento di una stringa descrittiva nel campo "info"
             data(i,j,k).info=['Content of "data(' num2str(i) ',' ...
                num2str(j) ',' num2str(k) ')'];
             % Stampa a video (solo per "dimostrazione")
             data(i,j,k)
          end
       end
    end
    
    Output:
    ans = 
        vettore: [0.7947 0.5774 0.4400]
           info: 'Content of "data(1,1,1)'
    
    ans = 
        vettore: [0.2576 0.7519 0.2287]
           info: 'Content of "data(1,1,2)'
    
    ans = 
        vettore: [0.0642 0.7673 0.6712]
           info: 'Content of "data(1,2,1)'
    
    ans = 
        vettore: [0.7152 0.6421 0.4190]
           info: 'Content of "data(1,2,2)'
    
    ans = 
        vettore: [0.3908 0.8161 0.3174]
           info: 'Content of "data(2,1,1)'
    
    ans = 
        vettore: [0.8145 0.7891 0.8523]
           info: 'Content of "data(2,1,2)'
    
    ans = 
        vettore: [0.5056 0.6357 0.9509]
           info: 'Content of "data(2,2,1)'
    
    ans = 
        vettore: [0.4440 0.0600 0.8667]
           info: 'Content of "data(2,2,2)'
    
    Hope this helps.
  • Re: Memorizzare Vettori Indicizzandoli

    Perfetto grazie mille.Ci siamo quasi, l'unico problema che mi rimane (o forse sono io che non ho la soluzione) è di poter usare gli elementi della matrice data come vettori. Per intenderci ogni elemento della matrice è una cosa del tipo
    
        vettore: [0.0642 0.7673 0.6712]
           info: 'Content of "data(1,2,1)'
    Posso anche togliere info, ma con quello che rimane non posso comunque fare operazioni con vettori. Se faccio data(1,1,1)+data(2,1,1) per esempio, ovviamente mi da errore. Come faccio a convertire gli elementi della matrice con vettori su cui operare?
    Grazie mille.
  • Re: Memorizzare Vettori Indicizzandoli

    Se vuoi usare la soluzione basata sull'uso delle strutture, puoi accedere ai contenuti del vari elementi in questo modo:

    per calcolare "data(1,1,1)+data(2,1,1)" ==>
    data(1,1,1).vettore + data(2,1,1).vettore
    Si accede ai campi delle strutture tramite "." (punto):

    La struttura in questione ha due campi: "vettore" e "info", quindi:

    data(i,j,k).vettore
    data(i,j,k).info

    Prova anche a dare un'occhiata qui http://it.mathworks.com/help/matlab/examples/create-a-structure-array.html, per esempio.

    Hope this helps.
  • Re: Memorizzare Vettori Indicizzandoli

    Perfetto ora ho tutto quello che mi serve.
    Grazie mille.
Devi accedere o registrarti per scrivere nel forum
8 risposte