Obecnie próbuję wykonać obliczyć sumę wszystkich sum podrzędnych w tablicy 10.000 x 10.000 wartości. Jako przykład, jeśli moja tablica była:Jak mogę wektoryzować i przyspieszyć obliczenia dla tej dużej macierzy?
1 1 1
2 2 2
3 3 3
Chcę być wynikiem:
1+1+1+2+2+2+3+3+3 [sum of squares of size 1]
+(1+1+2+2)+(1+1+2+2)+(2+2+3+3)+(2+2+3+3) [sum of squares of size 2]
+(1+1+1+2+2+2+3+3+3) [sum of squares of size 3]
________________________________________
68
Tak, jak za pierwszym razem napisałem bardzo prosty kod Pythona, aby to zrobić. Tak jak było w O (k^2.n^2) (n jest wielkością dużej tablicy i k wielkości podskali, które otrzymujemy), przetwarzanie było strasznie długie. Pisałem w inny algorytm O (n^2), aby ją przyspieszyć:
def getSum(tab,size):
n = len(tab)
tmp = numpy.zeros((n,n))
for i in xrange(0,n):
sum = 0
for j in xrange(0,size):
sum += tab[j][i]
tmp[0][i] = sum
for j in xrange(1,n-size+1):
sum += (tab[j+size-1][i] - tab[j-1][i])
tmp[j][i] = sum
finalsum = 0
for i in xrange(0,n-size+1):
sum = 0
for j in xrange(0,size):
sum += tmp[i][j]
finalsum += sum
for j in xrange(1,n-size+1):
finalsum += (tmp[i][j+size-1] - tmp[i][j-1])
return finalsum
Więc ten kod działa poprawnie. Biorąc pod uwagę tablicę i wielkość subsquares, zwróci sumę wartości we wszystkich tych subsquares. Zasadniczo iteracja nad wielkością subskry w celu uzyskania wszystkich możliwych wartości.
Problem polega na tym, że to znowu będzie długie na duże tablice (ponad 20 dni dla tablicy 10.000 x 10.000). Przeszukałem go i dowiedziałem się, że mogę wektoryzować iteracje po tablicach z numpy. Jednak nie mogłem wymyślić, jak to zrobić w moim przypadku ...
Jeśli ktoś może mi pomóc przyspieszyć mój algorytm lub dać mi dobrą dokumentację na ten temat, będę zadowolony!
Dziękujemy!
Myślę, że byłoby lepsze podejście do obliczania czasów count każdej liczby w macierzy ... – Sayakiss
Proszę spojrzeć na moją edycję: Otrzymuję algorytm O (n^2) ... – Sayakiss