2012-06-04 4 views
7

Ad esempio, dato i=5 e n=8, voglio generare [0;0;0;0;1;0;0;0]. In particolare, voglio generare il vettore v in modo che:Matlab/Octave one-liner per un n-vettore con 1 nella posizione i-es

v = zeros(n,1); 
v(i) = 1; 

C'è un modo (ragionevole) per fare questo in una linea?

+1

possibili duplicati (generalizzazione di questa domanda): [Creazione matrice indicatore] (http://stackoverflow.com/questions/6150174/creating-indicator-matrix), [rappresentazione Matlab/Ottava 1-of-K] (http : //stackoverflow.com/q/8054258/97160) o [Matlab, Vettore intero in matrice binaria senza loop] (http://stackoverflow.com/q/8116991/97160) – Amro

risposta

5

Ecco un'altra soluzione utilizzando sparse per creare un vettore riga n lunghezza con un 1 nella i ° posizione:

v = sparse(1,i,1,1,n) 

Il vantaggio è che per grandi n, questo è anche efficiente della memoria e può essere utilizzato come solito nei calcoli matriciali. Se hai mai bisogno del vettore completo, usa semplicemente full.

+0

Grazie! Ho scelto questa risposta per le considerazioni sulla memoria. – Snowball

11

Un modo è [1:8]'==5, o più in generale [1:n]'==i

+4

Buona soluzione. Ma non è esattamente * lo stesso, dal momento che si ottiene logico invece di doppio. Farei double ([1: n] '== i); –

+0

+1 per la risposta, +1 per il commento di Andrey. Il doppio è necessario per essere la risposta _exact_ alla domanda originale. –

1

Ecco un altro:

n = 8; 
p = 4; 
arrayfun(@str2double,dec2bin(2^(p-1),n)) 

E un altro (crea un vettore riga):

circshift([1 zeros(1,n-1)],[0 p]); 

O un vettore colonna :

circshift([1 ; zeros(n-1,1)],[p 0]); 

Qui è un altro:

subsref(eye(n), struct('type','()', 'subs',{{ p,':' }})) 
13

Un'altra soluzione:

I = eye(n); 

v = I(:, i); 

In realtà, si può avere un vettore y di numeri da 1 a n e ottenere vettori come questo per ogni elemento :

v = I(:, y); 

È possibile vedere il mio blog post per i dettagli su questa soluzione generale.

+0

Questa dovrebbe essere la risposta accettata! – carlossierra