[matlab] matrice
Salve,
avrei un problema con matlab. Vorrei creare questo tipo di processo:
ho 2 vettori X e Y
$\ X=[1,2,3,4,5,6]\ $
$ Y=\[10,20,30]\ $
la matrice che dovrei realizzare è questa
$\C=((1,2,3,4,5,5,4,3,2,1,1,2,3,4,5),(10,10,10,10,10,20,20,20,20,20,30,30,30,30,30),(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0))\ $
il vettore X viene ripetuto n volte la dimensione del vettore Y, in questo caso 3, però X quando viene ripetuto, per la posizione di Y pari deve invertirsi e diventare $ \[5,4,3,2,1]\ $
Mi sapreste dire come automatizzare il processo?
avrei un problema con matlab. Vorrei creare questo tipo di processo:
ho 2 vettori X e Y
$\ X=[1,2,3,4,5,6]\ $
$ Y=\[10,20,30]\ $
la matrice che dovrei realizzare è questa
$\C=((1,2,3,4,5,5,4,3,2,1,1,2,3,4,5),(10,10,10,10,10,20,20,20,20,20,30,30,30,30,30),(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0))\ $
il vettore X viene ripetuto n volte la dimensione del vettore Y, in questo caso 3, però X quando viene ripetuto, per la posizione di Y pari deve invertirsi e diventare $ \[5,4,3,2,1]\ $
Mi sapreste dire come automatizzare il processo?
Risposte
Immagino che il modo più facile sia quello di fare un ciclo su 1:length(Y) e concatenare ogni blocco.
Un modo è il seguente:
Al posto di fliplr(A) potevi anche scrivere 5:-1:1 e potevi anche non creare variabili temporanee.
A = 1:5; B = ones(1,5); R1 = cat(2, A, fliplr(A), A); R2 = cat(2, 10*B, 20*B, 30*B); R3 = zeros(1,15); A = cat(1, R1, R2, R3); clear B R1 R2 R3
Al posto di fliplr(A) potevi anche scrivere 5:-1:1 e potevi anche non creare variabili temporanee.
Il seguente codice non usa il ciclo di cui parlavo prima. Provando a pensare come risolvere il problema sono arrivato alla conclusione che così è probabilmente meglio. Suppongo che X e Y siano matrici riga[\b].
Creo per prima cosa una matrice RX in cui ogni colonna è una copia di X e il numero di colonne è uguale a quello degli elementi di Y. Poi ribalto le colonne di indice pari. Infine cambio la forma della matrice RX in modo che sia nuovamente una matrice riga.
Faccio qualcosa di simile per Y ma questa volta ogni colonna ha length(X) copie di ogni elemento di Y. Sempre nella stessa riga cambio poi le dimensioni in modo da avere nuovamente una matrice riga.
Infine concateno le 2 righe con una formata da tutti zeri.
EDIT: sostituito i prodotti con vettori di uno con repmat.
RX = repmat(X', 1, length(Y)); RX(:,2:2:end) = flipud(RX(:,2:2:end)); RX = reshape(RX, 1, length(X)*length(Y));
Creo per prima cosa una matrice RX in cui ogni colonna è una copia di X e il numero di colonne è uguale a quello degli elementi di Y. Poi ribalto le colonne di indice pari. Infine cambio la forma della matrice RX in modo che sia nuovamente una matrice riga.
RY = repmat(Y, length(X), 1); RY = reshape(RY, 1, length(X)*length(Y));
Faccio qualcosa di simile per Y ma questa volta ogni colonna ha length(X) copie di ogni elemento di Y. Sempre nella stessa riga cambio poi le dimensioni in modo da avere nuovamente una matrice riga.
C = [RX; RY; zeros(1, length(X)*length(Y))];
Infine concateno le 2 righe con una formata da tutti zeri.
EDIT: sostituito i prodotti con vettori di uno con repmat.
perfetto è proprio quello che volevo grazie mille.
Visto che ci sono chiedo anche un altra cosa
Devo importare 2 tipi di file kml e txt
sapete come posso scrivere il ciclo if
io ho provato con
ma nn ho ottenuto i risultati sperati
Visto che ci sono chiedo anche un altra cosa
Devo importare 2 tipi di file kml e txt
sapete come posso scrivere il ciclo if
io ho provato con
if '*.kml' istruzione else '.txt' istruzione end
ma nn ho ottenuto i risultati sperati