ضرب المصفوفات والمحددات
استخدم %*% لضرب المصفوفات وdet() لحساب المحدد.
ضرب المصفوفات والمحددات درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
إنشاء المصفوفات في R
المصفوفات هي صفائف ثنائية الأبعاد تُملأ عمودًا بعد عمود افتراضيًا. استخدموا matrix(data, nrow, ncol). ويمكنكم تسمية الصفوف والأعمدة باستخدام rownames() وcolnames().
# Create a 3x3 matrix (filled column-wise)
A <- matrix(c(1, 2, 3,
4, 5, 6,
7, 8, 9), nrow = 3, ncol = 3, byrow = TRUE)
print(A)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
dim(A) # 3 3
nrow(A) # 3
ncol(A) # 3ضرب المصفوفات: %*%
ينفّذ العامل %*% ضرب المصفوفات الحقيقي (الضرب النقطي للصفوف والأعمدة). أما العامل * فينفّذ ضربًا عنصرًا بعنصر، وهو خطأ شائع. يجب أن تكون الأبعاد متوافقة: (m×n) %*% (n×p) = (m×p).
A <- matrix(c(1, 2, 3, 4), nrow = 2)
B <- matrix(c(5, 6, 7, 8), nrow = 2)
# Element-wise multiplication (NOT matrix mult)
A * B
# [,1] [,2]
# [1,] 5 21
# [2,] 12 32
# True matrix multiplication
A %*% B
# [,1] [,2]
# [1,] 19 43
# [2,] 22 50
# Verify: entry [1,1] = 1*5 + 2*6 = 17... wait:
# A[1,] = c(1,3), B[,1] = c(5,6): 1*5 + 3*6 = 23فهم نتائج %*%
لنتحقق يدويًا من ضرب المصفوفات. إن العنصر (i,j) في C = A %*% B هو الضرب النقطي للصف i من A في العمود j من B: sum(A[i,] * B[,j]).
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3, byrow = TRUE)
# A is 2x3, B is 3x2 -> result is 2x2
C <- A %*% B
print(C)
# Verify entry C[1,1]:
# row 1 of A: c(1,2,3), col 1 of B: c(7,9,11)
manual_11 <- sum(A[1, ] * B[, 1])
manual_11 # 1*7 + 2*9 + 3*11 = 58
C[1, 1] # should matchالمحدِّد: det()
المحدِّد قيمة عددية تعبّر عن عامل تحجيم المصفوفة. تحسبه الدالة det(A). فإذا كان det(A) == 0، تكون المصفوفة منفردة (غير قابلة للعكس). وبالنسبة إلى مصفوفة 2×2، يكون det = ad - bc.
# 2x2 matrix: det = a*d - b*c
A <- matrix(c(3, 2, 1, 4), nrow = 2)
det(A) # 3*4 - 2*1 = 10
# Singular matrix: det = 0
S <- matrix(c(1, 2, 2, 4), nrow = 2)
det(S) # 0 -> not invertible
# Larger matrix
B <- matrix(c(2, -1, 0,
-1, 2, -1,
0, -1, 2), nrow = 3, byrow = TRUE)
det(B) # 4الأثر: sum(diag())
أثر المصفوفة هو مجموع عناصر قطرها. لا تحتوي R على دالة مضمّنة trace() للمصفوفات (فهذه دالة مختلفة)، لذا استخدموا sum(diag(A)). ويساوي الأثر مجموع القيم الذاتية.
A <- matrix(c(4, 2, 1,
3, 5, 0,
2, 1, 6), nrow = 3, byrow = TRUE)
# Extract diagonal elements
diag(A) # c(4, 5, 6)
# Trace = sum of diagonal
trace_A <- sum(diag(A))
trace_A # 15
# Trace = sum of eigenvalues (verify)
eigs <- eigen(A)$values
sum(Re(eigs)) # should also be approximately 15
# trace() in base R is NOT the matrix trace:
# trace(A) # this does something elsecrossprod() وtcrossprod()
تحسب crossprod(A, B) بكفاءة t(A) %*% B، أي الجداء التبادلي. وتحسب tcrossprod(A, B) القيمة A %*% t(B). وتكون هاتان الدالتان أسرع من استخدام النقل الصريح لأنهما تتجنبان إنشاء المصفوفة المنقولة.
A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3)
B <- matrix(c(7, 8, 9, 10, 11, 12), nrow = 3)
# t(A) %*% B (the slow way)
result1 <- t(A) %*% B
# crossprod(A, B) = t(A) %*% B (faster)
result2 <- crossprod(A, B)
all.equal(result1, result2) # TRUE
# crossprod(A) = t(A) %*% A
ATA <- crossprod(A)
print(ATA)
# tcrossprod(A, B) = A %*% t(B)
result3 <- tcrossprod(A, B)
all.equal(A %*% t(B), result3) # TRUEمصفوفة الوحدة باستخدام diag()
تنشئ diag(n) مصفوفة وحدة بحجم n×n. أما diag(v)، حيث v متجه، فتنشئ مصفوفة قطرية تضع v على قطرها. وتستخرج diag(A)، حيث A مصفوفة، القطر.
# 3x3 identity matrix
I3 <- diag(3)
print(I3)
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 1 0
# [3,] 0 0 1
# A * I = A (identity property)
A <- matrix(c(2, 3, 4, 5), nrow = 2)
all.equal(A %*% diag(2), A) # TRUE
# Create diagonal matrix from vector
D <- diag(c(2, 5, 10))
print(D)
det(D) # Product of diagonal: 100قوة المصفوفة والضرب المتكرر
لا تحتوي R على عامل مضمّن لقوة المصفوفة، لكن يمكنكم كتابة عامل باستخدام %*% داخل حلقة، أو استخدام حزمة expm. وتُعدّ القوة الثانية للمصفوفة A² = A %*% A عملية شائعة.
# Matrix square
A <- matrix(c(1, 1, 1, 0), nrow = 2)
A_sq <- A %*% A
print(A_sq)
# Fibonacci connection: A^n gives Fib numbers!
# Simple matrix power function
mat_pow <- function(M, n) {
result <- diag(nrow(M)) # start with identity
for (i in seq_len(n)) result <- result %*% M
result
}
mat_pow(A, 5) # A to the 5th power
# [1,] 8 5
# [2,] 5 3الجداء الخارجي باستخدام %o%
ينشئ الجداء الخارجي x %o% y مصفوفةً تكون فيها الخانة (i,j) = x[i] * y[j]. وهو مكافئ لـ outer(x, y). ويفيد في إنشاء مصفوفات التفاعلات وبعض الإنشاءات الرياضية.
x <- c(1, 2, 3)
y <- c(10, 20)
# Outer product: 3x2 matrix
P <- x %o% y
print(P)
# [,1] [,2]
# [1,] 10 20
# [2,] 20 40
# [3,] 30 60
# Same as outer(x, y)
identical(P, outer(x, y)) # TRUE
# Outer with custom function
outer(1:3, 1:3, FUN = '+')
# [,1] [,2] [,3]
# [1,] 2 3 4
# [2,] 3 4 5
# [3,] 4 5 6خصائص المحدِّد
الخصائص الأساسية: det(A %*% B) = det(A) * det(B)؛ وdet(t(A)) = det(A)؛ وdet(k*A) = k^n * det(A) لمصفوفة n×n؛ كما تغيّر عمليات الصفوف قيمة المحدِّد بطرق يمكن التنبؤ بها.
A <- matrix(c(2, 1, 5, 3), nrow = 2)
B <- matrix(c(4, 2, 1, 6), nrow = 2)
# det(A %*% B) = det(A) * det(B)
det(A %*% B)
det(A) * det(B)
# det(t(A)) = det(A)
det(t(A)); det(A)
# det(2A) = 2^n * det(A) for n=2
det(2 * A); 2^2 * det(A)
# det of upper triangular = product of diagonal
U <- matrix(c(3, 0, 0, 4, 2, 0, 1, 5, 7), nrow = 3, byrow = TRUE)
det(U); prod(diag(U)) # both = 42تطبيق عملي: المعادلات الطبيعية
في الانحدار الخطي، يحقق مُقدِّر OLS المعادلة t(X) %*% X %*% beta = t(X) %*% y. ويستخدم ذلك ضرب المصفوفات، إضافةً إلى الشرط det(t(X)%*%X) != 0 لضمان وجود حل وحيد.
# Generate simple regression data
set.seed(42)
n <- 20
x <- runif(n, 0, 10)
y <- 2 + 3 * x + rnorm(n)
# Design matrix with intercept column
X <- cbind(1, x)
# Check det of X'X (should be nonzero)
XtX <- crossprod(X) # t(X) %*% X
det(XtX) # large positive value
# Solve normal equations: beta = solve(X'X) %*% X'y
Xty <- crossprod(X, y) # t(X) %*% y
beta <- solve(XtX) %*% Xty
beta # Should be close to c(2, 3)
# Compare with lm()
coef(lm(y ~ x)) # same resultتحقّق سريع
اختبر مدى فهمك لعمليات المصفوفات في R.
مراجعة: عمليات المصفوفات
أهم النقاط: استخدم %*% لضرب المصفوفات، وليس *. تعطي det(A) محدِّد المصفوفة، ويعني الصفر أنها مصفوفة مفردة. تمثّل sum(diag(A)) الأثر. تحسب crossprod(A,B) بكفاءة القيمة t(A)%*%B. تنشئ diag(n) مصفوفة الوحدة، بينما تنشئ diag(v) مصفوفة قطرية. وتشكّل هذه العمليات أساس الانحدار وPCA والعديد من الأساليب العددية.
A <- matrix(c(2, 1, 1, 3), nrow = 2)
B <- matrix(c(1, 0, 0, 1), nrow = 2) # Identity
# Core matrix operations summary:
A %*% B # matrix multiply -> A
det(A) # 2*3 - 1*1 = 5
sum(diag(A)) # trace = 2+3 = 5
crossprod(A) # t(A) %*% A
tcrossprod(A) # A %*% t(A)
diag(3) # 3x3 identity
diag(c(1,2,3)) # diagonal matrix
A %o% c(1, 2) # outer productالأسئلة الشائعة
هل درس «ضرب المصفوفات والمحددات» مجاني؟
نعم — نص درس «ضرب المصفوفات والمحددات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «ضرب المصفوفات والمحددات»؟
استخدم %*% لضرب المصفوفات وdet() لحساب المحدد. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ضرب المصفوفات والمحددات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ضرب المصفوفات والمحددات
- حل الأنظمة الخطية باستخدام solve()
- القيم الذاتية والمتجهات الذاتية
- تحليلات SVD وQR وتشولسكي