Offensichtlich sind die Updates:
a_i = b_i-1 + c_i
b_i = 2*b_i-1 + c_i
die Rekursion Schreiben aus,
b_0 = c_0 # I'm not sure if c_0 is to be used
b_1 = 2*b_0 + c_1
= 2*c_0 + c_1
b_2 = 2*b_1 + c_2
= 2*(2*c_0 + c_1) + c_2
= 4*c_0 + 2*c_1 + c_2
b_3 = 2*b_2 + c_3
= 2*(4*c_0 + 2*c_1 + c_2) + c_3
= 8*c_0 + 4*c_1 + 2*c_2 + c_3
So scheint es, dass
b_i = np.sum((2**np.arange(i+1))[::-1] * c[:i])
a_i = b_i-1 + c_i
Es ist hier nicht möglich, eine kumulative Summe zu erstellen, da sich der Koeffizient c_i
ständig ändert.
Der einfachste Weg, um dies vollständig zu vektorisieren, ist wahrscheinlich nur eine riesige Matrix zu verwenden. Wenn c
Größe hat N
:
t = np.zeros((N, N))
x, y = np.tril_indices(N)
t[x, y] = 2 ** (x - y)
Das gibt uns:
>>> t
array([[ 1., 0., 0., 0.],
[ 2., 1., 0., 0.],
[ 4., 2., 1., 0.],
[ 8., 4., 2., 1.]])
So, jetzt können Sie tun:
b = np.sum(t * c, axis=1)
a = np.zeros(N)
a[1:] = b[:-1] + c[1:]
Ich würde wahrscheinlich diese Lösung nicht empfehlen. Von dem, was ich über Rechenmethoden weiß, scheint dies für große N
nicht numerisch stabil zu sein. Aber ich habe das Gefühl, dass dies für jede vektorisierte Lösung gilt, die die Summierung am Ende durchführt. Vielleicht solltest du sowohl die for-Schleife als auch dieses Stück Code ausprobieren und sehen, ob deine Fehler mit der vektorisierten Lösung in die Luft gehen.
Sie nach einem Weg suchen, das für diese spezifischen Werte von 'a' zu tun, 'b' und 'c', oder ist es für beliebige Werte von 'c'? – Praveen
@ Praveen, willkürliche Werte für alle genannten Arrays, ich bin nur auf der Suche nach einer generischen Lösung für dieses Problem. – gucciolo