[Matlab] Generare vettore
Ho scritto la funzione generaVettore che deve ritornarmi un vettore v di numeri float:
Mi chiedevo se c'e' un modo (probabilmente piu' elegante) di scrivere questa funzione in modo da non dover creare il vettore k.
Infatti con la mia soluzione vengono allocati in memoria due vettori (k e v) mentre penso che si possa non utilizzare il vettore ausiliario k.
Qualche suggerimento?
function [v]=generaVettore(n) k=1:n+1; v=cos((2*k-1)/(2*(n+1))*pi)*1/cos(pi/(2*(n+1)));
Mi chiedevo se c'e' un modo (probabilmente piu' elegante) di scrivere questa funzione in modo da non dover creare il vettore k.
Infatti con la mia soluzione vengono allocati in memoria due vettori (k e v) mentre penso che si possa non utilizzare il vettore ausiliario k.
Qualche suggerimento?
Risposte
Non sono certo che si possa in questo caso parlare di ottimizzazione. Il numero di array/matrici creati da Matlab non è necessariamente uguale a quello delle assegnazioni. È possibile che i due codici abbiano esattamente lo stesso comportamento a run-time.
Quando Matlab esegue uno script esegue diverse ottimizzazioni e le versioni che fanno uso di operazioni vettoriali/matriciali di più alto livello sono spesso più facilmente ottimizzabili che cicli e simili. Ma in questo caso credo che non ci voglia tanto a riconoscere che \(k\) viene usato solo per creare \(v\) e probabilmente i due codici producono alla fine un risultato molto simile. È comunque possibile verificare queste affermazioni verificando i tempi di calcolo per le due versioni. In ogni caso ci sono parecchie altre migliorie. Per esempio
Dopodichè
Immagino che matlab sia poi in grado di osservare che il termine 1/(2*(n+1)) sia presente più volte nell'espressione e cose simili. Personalmente preferirei puntare comunque sulla leggibilità in un codice del genere piuttosto che cercare di ottimizzare qualcosa che probabilmente è perfettamente in grado di ottimizzare matlab e che forse viene eseguito una sola volta durante tutta l'esecuzione del programma.
(2*k - 1) => 2*(1:(n+1)) - 1 => 2:2:(2*n+2) - 1 => 1:2:(2*n+1)
Dopodichè
*1/cos(pi/(2*(n+1))) => /code(pi/(2*(n+1)))
Immagino che matlab sia poi in grado di osservare che il termine 1/(2*(n+1)) sia presente più volte nell'espressione e cose simili. Personalmente preferirei puntare comunque sulla leggibilità in un codice del genere piuttosto che cercare di ottimizzare qualcosa che probabilmente è perfettamente in grado di ottimizzare matlab e che forse viene eseguito una sola volta durante tutta l'esecuzione del programma.
Grazie mille, ho optato per la soluzione proposta da TeM in modo da combinare leggibilita' ed eleganza (a mio avviso).
Ora se volessi plottare questi punti sulla retta reale come potrei fare?
Esiste cioe' la possibilita' di stampare grafici unidimensionali?
Ora se volessi plottare questi punti sulla retta reale come potrei fare?
Esiste cioe' la possibilita' di stampare grafici unidimensionali?
Ok, grazie!
Un'ultima domanda...
Voglio ottenere il vettore dei valori $2^(n+1)/(enlog(n))$ prendendo i valori di $n$ dal vettore
Come posso fare?
Un'ultima domanda...
Voglio ottenere il vettore dei valori $2^(n+1)/(enlog(n))$ prendendo i valori di $n$ dal vettore
n=10:10:500.
Come posso fare?
In che base è quel logaritmo? Inoltre la funzione è la seguente?
\[ \frac{2^{n+1}}{e^{n\log(n)}} \]
\[ \frac{2^{n+1}}{e^{n\log(n)}} \]
Il logaritmo e' logaritmo naturale in base e.
La funzione e' proprio quella che ho scritto...la e e' moltiplicata
La funzione e' proprio quella che ho scritto...la e e' moltiplicata
