2011-02-07 24 views
39

En Haskell, si quería obtener una lista de 10 elementos que sólo contenía el número 5, que podría hacer algo como esto:gama Llenar MATLAB con los mismos valores

take 10 $ repeat 5 

Salida:

[5,5,5,5,5,5,5,5,5,5] 

¿Hay algo como esto en MATLAB?

+1

http://www.mathworks.com/help/techdoc/ref/repmat.html – zellus

+0

Muchas gracias. Si envía esto como respuesta, lo marcaré como correcto. – Tyler

+0

posibles preguntas relacionadas: http://stackoverflow.com/questions/1947889/element-wise-array-replication-in-matlab, http://stackoverflow.com/questions/1975772/matlab-array-manipulation, http://stackoverflow.com/questions/2382319/matlab-element-wise-array-replication-according-to-a-count – Amro

Respuesta

63

Es fácil asignar valores repetidos a una matriz:

x(1:10) = 5; 

Si desea generar la matriz de elementos de línea en un comunicado intentar algo como esto:

ones(1,10) * 5 

o

repmat(5, 1, 10) 
+1

'x (1:10)' también funciona para un personaje, y 'repmat (..)' también funciona para una cadena. Por ejemplo: 'repmat ('ab', 1, 10)' da 'abababababababababab'. –

5

Consulte repmat en la documentación.

B = repmat(5,1,10) 
22

El método queridos es mucho más rápido que utilizando repmat:

>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc 
Elapsed time is 3.426347 seconds. 
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc 
Elapsed time is 20.603680 seconds. 

Y, en mi opinión, lo convierte en código mucho más fácil de leer.

0

Como se ha mencionado en otras respuestas que puede utilizar:

>> tic; x=5*ones(10,1); toc 
Elapsed time is 0.000415 seconds. 

Un método aún más rápido es:

>> tic; x=5; x=x(ones(10,1)); toc 
Elapsed time is 0.000257 seconds. 
+0

Al usar 'timeit' (que es más robusto que' tic'/'toc') y un ejemplo con mucho más de 10 elementos, ** esto puede mostrarse como falso **. El primer método es más rápido, una prueba tan rápida como la suya es poco probable que sea precisa; por ejemplo, si vuelve a ejecutar su ejemplo varias veces, obtendrá conclusiones diferentes. Pruebe: 'm1 = @() 5 * ones (1e7,1); x = 5; m2 = @() x (unos (1e7,1)); 'Para configurar las funciones anónimas que ejecutan sus pruebas, entonces use las teclas' timeit (m1) 'y' timeit (m2) '.Me sale que 'm2' es ~ 3x * más lento *. Sí, este es un método válido para crear una matriz de un solo valor, pero no es un método más rápido. – Wolfie

3

Dado un m-by-n tamaño de la matriz predefinido y el valor objetivo val, en su ejemplo:

m = 1; 
n = 10; 
val = 5; 

Actualmente hay 7 ap diferentes enfoques que vienen a la mente:


1) Uso de la función repmat(0.094066 segundos)

A = repmat(val,m,n) 

2) de indexación en la matriz sin definir con asignación(0.091561 segundos)

A(1:m,1:n) = val 

3) de indexación sobre el valor de destino mediante el ones de función(0.151357 segundos)

A = val(ones(m,n)) 

4) de inicialización predeterminado con asignación completa(0.104292 segundos)

A = zeros(m,n); 
A(:) = val 

5) Usando la función de ones con la multiplicación(0.069601 segundos)

A = ones(m,n) * val 

6) Usando la función de zeros con adición(0.057883 segundos)

A = zeros(m,n) + val 

7) Uso de los repelem función(0.168396 segundos)

A = repelem(val,m,n) 

Después de la descripción de cada enfoque, entre paréntesis, su índice de referencia correspondiente a cabo bajo Matlab 2017a y con 100000 iteraciones. El ganador es el enfoque 6th, y esto no me sorprende.

La explicación es simple: la asignación generalmente produce ranuras llenas de cero ... por lo tanto, no se realizan otras operaciones excepto la adición de val a cada miembro de la matriz, y en la parte superior, los argumentos de entrada se desinfectan muy corto.

El mismo no se puede decir para el enfoque 5th, que es el segundo más rápido uno porque, a pesar del proceso de desinfección argumentos de entrada siendo básicamente el mismo, en el lado de memoria tres operaciones se llevan a cabo en lugar de dos:

  • la asignación inicial
  • la transformación de cada elemento en 1
  • la multiplicación por val
Cuestiones relacionadas