Matrix (ma trận) là mảng 2D (2 chiều) có thể dùng để lưu trữ & làm việc với dữ liệu giống bảng tính (spreadsheet-like).
Chúng có thể dùng cho:
- Biểu diễn bàn cờ trong game bàn cờ (cờ vua, cờ đàm, v.v.)
- Thống kê & phân tích dữ liệu
- Tạo biểu đồ & đồ thị
Bởi vì đây là cấu trúc dữ liệu mạnh mẽ, việc học cách dùng nó rất hữu ích.
Cách tạo Matrix trong Ruby
Bạn có thể tạo matrix với mảng.
Như sau:
matrix = [ [1,2,3], [4,5,6], [7,8,9] ]
Điều này tạo ra matrix 3×3 & đây là lựa chọn tốt nhất nếu bạn muốn lưu trữ dữ liệu 2 chiều như bàn cờ hoặc tập hợp vị trí.
Nhưng nếu bạn muốn kết hợp matrix qua phép cộng, trừ & nhân…
Thì bạn có thể dùng class Matrix.
Cách dùng:
require 'matrix' a = Matrix[[1,2,3], [4,5,6], [7,8,9]] b = Matrix[[1,2,3], [4,5,6], [7,8,9]]
Bây giờ bạn có thể cộng chúng:
a + b # Matrix[[2, 4, 6], [8, 10, 12], [14, 16, 18]]
Bạn có thể truy cập giá trị riêng lẻ như sau:
a[0, 1]
Điều này khác với phiên bản mảng, sẽ dùng cú pháp:
matrix[0][1]
Cả array & matrix đều có thể transpose (chuyển vị), nghĩa là hàng thành cột & cột thành hàng.
Ví dụ:
matrix.transpose # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Cũng nhớ:
Object Matrix là immutable (bất biến), nên bạn không thể thay đổi giá trị mà không tạo matrix mới. Matrix này chủ yếu cho phép toán học, nếu bạn muốn phân tích dữ liệu & thống kê, bạn sẽ cần thứ mạnh hơn.
Điều gì đó như…
Gem Daru
Daru là gem cho phép bạn làm việc với matrix, lấy thống kê từ chúng & in chúng ra bảng định dạng đẹp. Daru cũng tích hợp với gem vẽ biểu đồ Ruby để bạn có thể tạo biểu đồ & đồ thị từ dữ liệu.
Ví dụ:
require 'daru'
df = Daru::DataFrame.new(
{ "A" => [1,2,3], "B" => [4,5,6], "C" => [7,8,9] },
index: ["A", "B", "C"]
)
In ra bảng sau:
A B C A 1 4 7 B 2 5 8 C 3 6 9
Bạn có thể truy cập cột cụ thể như sau:
df['A']
Hoặc bằng chỉ số số:
df[0]
Và bạn có thể lấy thống kê như sau:
df['B'].describe # statistics # count 3 # mean 5.0 # std 1.0 # min 4 # max 6
Phần hay nhất?
Bạn có thể load dữ liệu trực tiếp từ file CSV, ActiveRecord & thậm chí file Excel.
Ví dụ:
df = Daru::DataFrame.from_csv('healthy_food.csv')
Và bạn có thể lọc dữ liệu với biểu thức where.
Ví dụ…
Nếu chúng ta có cột "carbs", chúng ta có thể tìm tất cả hàng trong matrix có giá trị nhỏ hơn 25.
Như sau:
df.where(df['carbs'].lt(25))
Bạn cũng có thể sort, group_by & aggregate data frames của bạn.
Ví dụ:
df = Daru::DataFrame.new(
{ str: %w(a b c d a), num: [52,12,7,17,1] }
)
df.group_by(:str).aggregate(num: :sum)
# num
# a 53
# b 12
# c 7
# d 17
Vẽ biểu đồ với Daru (Plotting With Daru)
Daru cho phép bạn tạo biểu diễn trực quan dữ liệu & xuất ra file HTML.
Ví dụ:
df = Daru::DataFrame.new(
{'Cat Names' => %w(Kitty Leo Felix), 'Weight' => [2,3,5]}
)
df.plot(type: :bar, x: 'Cat Names', y: 'Weight') do |plot, _|
plot.x_label 'Cat Name'
plot.y_label 'Weight'
plot.yrange [0, 5]
end
.export_html
Điều này tạo ra biểu đồ:

Bạn sẽ tìm thấy biểu đồ này dưới dạng file HTML trong cùng thư mục với code của bạn.
Nếu bạn muốn dùng Daru trong ứng dụng Rails, bạn sẽ cần thêm gem daru-view vào hoặc dùng gem khác như chartkick.
Tóm tắt
Bạn đã học về matrix trong Ruby để có thể làm việc với dữ liệu 2 chiều!
Đừng quên chia sẻ bài viết này để nhiều người hơn tìm thấy nó.
Cảm ơn bạn đã đọc.