WHY it matters: Ek dense 106×106 matrix ko 1012 floats =8 TB chahiye — yeh possible hi nahi hai. Agar har row mein ~5 nonzeros hain, toh nnz=5×106, ~120 MB mein store ho jaata hai. Same problem, ∼105× kam memory.
Step 1 — nonzeros ko row by row list karo.Kyun? CSR ki ordering convention hai "har row ko left→right scan karo."
Row0: (0,10). Row1: (1,20). Row2: (0,30),(2,40),(3,50). Row3: (1,60).
Toh data = [10, 20, 30, 40, 50, 60], indices = [0, 1, 0, 2, 3, 1].
Step 2 — har row mein nonzeros count karo. Counts =[1,1,3,1].
Kyun?indptr inhi ka cumulative sum hai, jo humein boundaries batata hai.
from scipy.sparse import diagsfrom scipy.sparse.linalg import spsolve, cgn = 1000# 1D Poisson: tridiagonal [-1, 2, -1]A = diags([-1, 2, -1], [-1, 0, 1], shape=(n, n), format='csc')b = np.ones(n)x_direct = spsolve(A, b) # sparse LU (CSC use karta hai)x_iter, info = cg(A, b) # conjugate gradient (sirf SPD ke liye)
spsolve ke liye CSC kyun? Sparse LU factorization columns process karta hai; CSC pass karne se internal conversion bachti hai.
cg yahan kyun? Yeh A symmetric positive definite hai, isliye Conjugate Gradient fast converge karta hai aur dense factorization kabhi form nahi karta.
CSR define karne wale teen arrays kaunse hain? → data, indices, indptr.
indptr ki length? → n+1.
Row i ke nonzeros kahan rehte hain? → data[indptr[i]:indptr[i+1]].
Direct solvers kaun sa format prefer karte hain? → CSC.
SpMV cost? → O(nnz).
Recall Feynman: ek 12-saal ke bacche ko explain karo
Socho ek giant spreadsheet jo almost saari khali boxes se bhari hai. Har khali box likhne ki jagah, tum sirf woh boxes likhte ho jisme koi number hai — aur ek chhoti si note saath rakhte ho jisme likha ho "row 2 yahan se shuru hoti hai, row 3 yahan se." Woh note hai indptr: yeh bookmarks ki tarah hai jo batata hai ki har row ke numbers kahan se shuru hote hain, taaki tum seedha kisi bhi row par jump kar sako. Kyunki tumne saari blank jagah skip kar di, computer bahut kam padhta hai aur bahut jaldi khatam karta hai.
data (nonzeros row-by-row), indices (har nonzero ka column index), indptr (length n+1, row-start offsets).
CSR mein row i ke nonzeros kaise nikalte hain?
data[indptr[i]:indptr[i+1]] at columns indices[indptr[i]:indptr[i+1]].
CSR indptr ki length aur last value kya hoti hai?
Length n+1; last value nnz (total nonzeros) ke barabar hoti hai.
CSC, CSR se kaise alag hai?
CSC column-by-column store karta hai: indices mein row indices hote hain, indptr column starts mark karta hai; fast column slicing aur direct solvers use karte hain ise.
Sparse matrix COO (ya LIL/DOK) mein kyun banate hain phir convert karte hain?
COO/LIL mein insertion sasta hai; CSR/CSC mein insertion O(nnz) ka hai. Ek baar banao, ek baar convert karo.
CSR mein sparse matrix-vector product y=Ax ki cost kya hai?
O(nnz), har row ke slice mein data[k]*x[indices[k]] sum karte hain.
Sparse matrix kab use NAHI karni chahiye?
Jab density zyada ho (≳10%): index overhead (2·nnz ints) sparse ko dense se bada aur slow bana sakti hai.
Sparse solve karne wala scipy function kaun sa hai aur woh kaun sa format pasand karta hai?