|
import gradio as gr |
|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
from io import BytesIO |
|
from PIL import Image |
|
def matrix_vector_multiplication_visualization(matrix, vector): |
|
try: |
|
|
|
matrix = np.array([[float(x) for x in row.split(",")] for row in matrix.split(";")]) |
|
vector = np.array([float(x) for x in vector.split(",")]) |
|
|
|
|
|
if matrix.shape != (2, 2): |
|
return "Error: Matrix must be 2x2.", None |
|
if vector.shape != (2,): |
|
return "Error: Vector must be 2D.", None |
|
|
|
|
|
transformed_vector = np.dot(matrix, vector) |
|
|
|
|
|
x = np.linspace(-1, 1, 10) |
|
y = np.linspace(-1, 1, 10) |
|
X, Y = np.meshgrid(x, y) |
|
grid = np.vstack([X.flatten(), Y.flatten()]) |
|
transformed_grid = np.dot(matrix, grid).reshape(2, -1, 10) |
|
|
|
|
|
fig, ax = plt.subplots(figsize=(6, 6)) |
|
|
|
|
|
for i in range(grid.shape[1]): |
|
ax.plot([grid[0, i], transformed_grid[0, i]], [grid[1, i], transformed_grid[1, i]], |
|
color="gray", linewidth=0.5, alpha=0.7) |
|
|
|
|
|
ax.quiver(0, 0, vector[0], vector[1], angles="xy", scale_units="xy", scale=1, color="red", label="Original Vector") |
|
|
|
|
|
ax.quiver(0, 0, transformed_vector[0], transformed_vector[1], angles="xy", scale_units="xy", scale=1, color="blue", label="Transformed Vector") |
|
|
|
|
|
ax.axhline(0, color='black', linewidth=0.5) |
|
ax.axvline(0, color='black', linewidth=0.5) |
|
ax.set_xlim(-2, 2) |
|
ax.set_ylim(-2, 2) |
|
ax.set_aspect('equal') |
|
ax.grid(True) |
|
ax.legend() |
|
ax.set_title("Matrix-Vector Multiplication Visualization") |
|
|
|
|
|
buf = BytesIO() |
|
plt.savefig(buf, format="png") |
|
buf.seek(0) |
|
plt.close(fig) |
|
|
|
return f"Transformed Vector: {transformed_vector.tolist()}", Image.open(buf) |
|
except Exception as e: |
|
return f"Error: {str(e)}", None |
|
|
|
|
|
with gr.Blocks() as app: |
|
gr.Markdown("## Matrix-Vector Multiplication Visualization") |
|
gr.Markdown(""" |
|
- Enter a **2x2 matrix** as `a,b;c,d` (rows separated by semicolons). |
|
- Enter a **2D vector** as `x,y`. |
|
- See the original vector (red), transformed vector (blue), and grid transformation. |
|
""") |
|
|
|
with gr.Row(): |
|
matrix_input = gr.Textbox(label="Matrix (2x2, e.g., 1,0;0,1)", placeholder="e.g., 1,0;0,1") |
|
vector_input = gr.Textbox(label="Vector (2D, e.g., 1,1)", placeholder="e.g., 1,1") |
|
|
|
output_text = gr.Textbox(label="Result") |
|
output_image = gr.Image(label="Visualization") |
|
|
|
calculate_button = gr.Button("Visualize") |
|
calculate_button.click( |
|
fn=matrix_vector_multiplication_visualization, |
|
inputs=[matrix_input, vector_input], |
|
outputs=[output_text, output_image] |
|
) |
|
|
|
app.launch() |