2012-09-08 42 views
10

¿Cuál es la forma más eficiente de producir una matriz de 100 números que forman la forma de la onda triangular a continuación, con una amplitud máxima/mínima de 0.5?matriz en forma de onda triangular en Python

Triángulo de forma de onda en mente:

enter image description here

+0

¿Necesita simplemente organizar la estructura de datos o dibujar una representación gráfica también? –

+0

Solo necesita hacer una matriz de 100 entradas de datos que toman esa forma. ¡Representación gráfica no necesaria! – 8765674

+0

Wikipedia tiene 3 fórmulas diferentes que puede usar para calcular una onda triangular: http://en.wikipedia.org/wiki/Triangle_wave#Definitions Puede haber formas más rápidas, pero implementar una de esas ecuaciones debería ser un buen punto de partida. –

Respuesta

8

uso de un generador:

def triangle(length, amplitude): 
    section = length // 4 
    for direction in (1, -1): 
     for i in range(section): 
      yield i * (amplitude/section) * direction 
     for i in range(section): 
      yield (amplitude - (i * (amplitude/section))) * direction 

esto funcionará bien para una longitud divisible por 4, puede perder hasta 3 valores para otra longitudes.

>>> list(triangle(100, 0.5)) 
[0.0, 0.02, 0.04, 0.06, 0.08, 0.1, 0.12, 0.14, 0.16, 0.18, 0.2, 0.22, 0.24, 0.26, 0.28, 0.3, 0.32, 0.34, 0.36, 0.38, 0.4, 0.42, 0.44, 0.46, 0.48, 0.5, 0.48, 0.46, 0.44, 0.42, 0.4, 0.38, 0.36, 0.33999999999999997, 0.32, 0.3, 0.28, 0.26, 0.24, 0.21999999999999997, 0.2, 0.18, 0.15999999999999998, 0.14, 0.12, 0.09999999999999998, 0.08000000000000002, 0.06, 0.03999999999999998, 0.020000000000000018, -0.0, -0.02, -0.04, -0.06, -0.08, -0.1, -0.12, -0.14, -0.16, -0.18, -0.2, -0.22, -0.24, -0.26, -0.28, -0.3, -0.32, -0.34, -0.36, -0.38, -0.4, -0.42, -0.44, -0.46, -0.48, -0.5, -0.48, -0.46, -0.44, -0.42, -0.4, -0.38, -0.36, -0.33999999999999997, -0.32, -0.3, -0.28, -0.26, -0.24, -0.21999999999999997, -0.2, -0.18, -0.15999999999999998, -0.14, -0.12, -0.09999999999999998, -0.08000000000000002, -0.06, -0.03999999999999998, -0.020000000000000018] 
+0

Mucho más eficiente que mi intento. ¡Gracias! – 8765674

+1

cambia 'range' a' xrange' (si es python <3) – zenpoy

1

Puede usar un generador de iterador junto con el método numerado fromiter.

import numpy 

def trigen(n, amp): 
    y = 0 
    x = 0 
    s = amp/(n/4) 
    while x < n: 
     yield y 
     y += s 
     if abs(y) > amp: 
      s *= -1 
     x += 1 

a = numpy.fromiter(trigen(100, 0.5), "d") 

Ahora tiene una matriz con la onda cuadrada.

4

Para utilizar numpy:

def triangle2(length, amplitude): 
    section = length // 4 
    x = np.linspace(0, amplitude, section+1) 
    mx = -x 
    return np.r_[x, x[-2::-1], mx[1:], mx[-2:0:-1]] 
2

triángulo es valor absoluto de diente de sierra.

from scipy import signal 
time=np.arange(0,1,0.001) 
freq=3 
tri=np.abs(signal.sawtooth(2 * np.pi * freq * time)) 
4

La forma más sencilla de generar una onda triangular es mediante el uso de signal.sawtooth. Observe que signal.sawtooth (phi, width) acepta dos argumentos. El primer argumento es la fase, el siguiente argumento especifica la simetría. ancho = 1 da un diente de sierra de lado derecho, ancho = 0 da un diente de sierra de lado izquierdo y ancho = 0.5 da un triángulo simétrico. ¡Disfrutar!

from scipy import signal 
import numpy as np 
import matplotlib.pyplot as plt 
t = np.linspace(0, 1, 500) 
triangle = signal.sawtooth(2 * np.pi * 5 * t, 0.5) 
plt.plot(t, triangle) 
Cuestiones relacionadas