1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| cat > gen_matrix.py << 'EOF'
import numpy as np import argparse from scipy.sparse import diags, csr_matrix import os
def generate_tridiagonal(n): print(f"Generating {n}x{n} tridiagonal matrix...") main_diag = 4.0 * np.ones(n) off_diag = -1.0 * np.ones(n - 1) A = diags([main_diag, off_diag, off_diag], [0, -1, 1], format='csr') return A
def save_csr_matrix(A, filename): n = A.shape[0] nnz = A.nnz values = A.data col_idx = A.indices row_ptr = A.indptr with open(filename, 'w') as f: f.write(f"{n} {nnz}\n") for i, v in enumerate(values): f.write(f"{v:.10f}") if i < nnz - 1: f.write(" ") f.write("\n") for i, idx in enumerate(col_idx): f.write(f"{idx}") if i < nnz - 1: f.write(" ") f.write("\n") for i, ptr in enumerate(row_ptr): f.write(f"{ptr}") if i < n: f.write(" ") f.write("\n") print(f"Saved to {filename}, size: {n}x{n}, nnz: {nnz}")
def save_vector(b, filename): with open(filename, 'w') as f: for i, val in enumerate(b): f.write(f"{val:.10f}") if i < len(b) - 1: f.write(" ") f.write("\n") print(f"Saved to {filename}, size: {len(b)}")
def main(): parser = argparse.ArgumentParser() parser.add_argument('--size', '-n', type=int, default=1000) parser.add_argument('--output', '-o', default='matrix') args = parser.parse_args() print("="*60) print(f"Generating {args.size}x{args.size} matrix") print("="*60) A = generate_tridiagonal(args.size) x_true = np.ones(args.size) b = A.dot(x_true) save_csr_matrix(A, f"{args.output}.txt") save_vector(b, f"{args.output}_b.txt") for f in [f"{args.output}.txt", f"{args.output}_b.txt"]: if os.path.exists(f): size_mb = os.path.getsize(f) / (1024*1024) print(f" {f}: {size_mb:.2f} MB") print("="*60) print("Done!")
if __name__ == "__main__": main() EOF
python gen_matrix.py --size 200000 --output matrix mv matrix_b.txt vector.txt
|