Meine bisherige Implementierung: Ich habe alle Matrizen vorkomputieren und sie als globale Variablen in meinem Programm behandeln. Ich habe mich entschlossen, sie als scipy.sparse matrices in csr_matrix format (ich habe gelesen, dass dies das beste Format ist, wenn ich nur Matrixvektorprodukte berechnen möchte) in einem Tupel . Um meine gewünschte Funktion zu berechnen, mache ich < /p>
Code: Select all
# precompute matrices, so treat them as global fixed variables
B = []
for j in range(1000):
sparse_matrix = ...compute it... # sparse csr_matrix of size 1000x1000
B.append(sparse_matrix)
B = tuple(B)
def func(u: np.ndarray) -> np.ndarray:
"""
u is a np.array of length N=1000
"""
return np.array([u.dot(B[k].dot(u.transpose())) for k in range(len(B))])
Danke im Voraus! stark> mit c [j] = u @ b [j] @ u Ich meine, ich möchte das Matrix-Vector-Produkt von B [j] und u und dann das dann berechnen inneres Produkt mit u . (Mathematisch u.Transponsed () * B * u )
Wenn es jemandem hilft. Hier ist ein kleines Benchmark -Programm, bei dem ich einige zufällige spärliche Matrizen erstelle und es an einem zufälligen Vektor bewertete. < /P>
Code: Select all
import numpy as np
from random import randint
from scipy.sparse import coo_matrix, csr_matrix
from time import time
# Create random tuple of sparse matrices
N = 1000
n = 100
B = []
for i in range(N):
data = np.random.uniform(-1, 1, n).tolist()
rows = [randint(0, N-1) for _ in range(n)]
cols = [randint(0, N-1) for _ in range(n)]
sparse_matrix = csr_matrix(coo_matrix((data, (rows, cols)), shape=(N, N)))
B.append(sparse_matrix)
B = tuple(B)
# My function
def func(u: np.ndarray) -> np.ndarray:
"""
u is a np.array of length N=1000
"""
return np.array([u.dot(B[k].dot(u.transpose())) for k in range(len(B))])
# random vector to evaluate function
u = np.random.uniform(-1, 1, N)
START = time()
func(u)
END = time()
print(f"Speed : {END - START}")
< /code>
>>> Speed : 0.005256175994873047