2012-06-04 18 views
7

Por ejemplo, dado i=5 y n=8, quiero generar [0;0;0;0;1;0;0;0]. En concreto, quiero generar el vector v de modo que:Matlab/Octave one-liner para un vector n con un 1 en la posición i-ésima

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

¿Hay alguna manera (razonable) para hacer esto en una línea?

+1

posibles duplicados (generalización de esta pregunta): [Crear matriz de indicadores] (http://stackoverflow.com/questions/6150174/creating-indicator-matrix), [Matlab/Octave 1-of-K representation] (http : //stackoverflow.com/q/8054258/97160) o [Matlab, vector entero en matriz binaria sin bucle] (http://stackoverflow.com/q/8116991/97160) – Amro

Respuesta

5

Aquí es otra solución utilizando sparse para crear un vector fila n longitud con un 1 en la posición de i th:

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

La ventaja es que para grandes n, esto también es eficiente de la memoria y se puede utilizar como habitual en los cálculos de la matriz. Si alguna vez necesita el vector completo, simplemente use full.

+0

¡Gracias! Elegí esta respuesta para las consideraciones de memoria. – Snowball

11

Una forma es [1:8]'==5, o más generalmente [1:n]'==i

+4

Buena solución. Pero no es * exactamente * lo mismo, ya que obtienes lógica en lugar de doble. Haría doble ([1: n] '== i); –

+0

+1 para la respuesta, +1 para el comentario de Andrey. El doble es necesario para ser la respuesta _exact_ a la pregunta original. –

1

Aquí hay otra:

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

Y otro (Crea un vector fila):

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

o un vector columna :

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

Aquí es otra:

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

Otra solución:

I = eye(n); 

v = I(:, i); 

En realidad, usted puede tener un vector y de los números de 1 a n y obtener los vectores de esta manera para cada elemento :

v = I(:, y); 

Puedes ver mi blog post para los detalles sobre esta solución general.

+0

¡Esta debería ser la respuesta aceptada! – carlossierra

Cuestiones relacionadas