Professional Documents
Culture Documents
المتجهات والمصفوفات
يستعمل الرمز +للجمع ،بينما يستعمل الرمز * لضرب عدد في متجه ولضرب متجه في متجه.
يستعمل األمر ) ( lengthإليجاد عدد عناصر المتجه .
يستعمل األمر ) ( maxإليجاد أكبر قيمة بين عناصر المتجه ،بينما يستعمل األمر ( min
) إليجاد أصغر قيمة بين عناصر المتجه.
يستعمل األمر ) ( meanإليجاد المتوسط الحسابي لعناصر المتجه.
يستعمل األمر )( tإليجاد محورة المتجه.
مثال :إذا كان لديك المتجهين ) 𝑉1 = (3,2,1و) 𝑉2 = (3,0, −1فأوجد،(𝑉1 𝑉2 ) − 𝑉1 ، 𝑉1 𝑉2 :
) .2𝑉1 + (𝑉1 𝑉2
الحل:
)> vec1<-c(3,2,1
)> vec2<-c(3,0,-1
> vec3<-vec1*vec2
> vec3
[1] 9 0 -1
> vec4<-vec3-vec1
> vec4
[1] 6 -2 -2
> vec5<-2*vec1+vec3
> vec5
[1] 8 8 8
Page | 1
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
مالحظة :إذا قمنا بجمع متجهين ذات أطوال مختلفة فإن Rستقوم بعملية تكرار المتجه األصغر حتى
تتساوى األطوال ،والمثال التالي يوضح ذلك.
مثال :أوجد حاصل جمع المتجهين التاليين:
)(1,2,0) + (2,1,0, −1,3,4,2
الحل:
)> c(1,2,0)+c(2,1,0,-1,3,4,2
[1] 3 3 0 0 5 4 3
Warning message:
In c(1, 2, 0) + c(2, 1, 0, -1, 3, 4, 2) :
longer object length is not a multiple of shorter object length
مثال :أوجد أكبر وأصغر قيمة والمتوسط الحسابي للقيم التالية .
8 ، -5 ، 7 ، 5 ، 0 ، 3 ،-1
الحل:
)> vec<-c(8,-5,7,5,0,3,-1
)> max(vec
[1] 8
)> min(vec
[1] -5
)> mean(vec
[1] 2.428571
يستعمل األمر ) ( sortلترتيب األعداد تصاعديا وتنازليا بعد تعريفها كمتجه .والمثال التالي يوضح
أكثر .
)> vec<-c(8,-5,7,5,0,3,-1
)> sort(vec,decreasing=TRUE
[1] 8 7 5 3 0 -1 -5
)> sort(vec
[1] -5 -1 0 3 5 7 8
)> sort(vec,decreasing=FALSE
[1] -5 -1 0 3 5 7 8
الحظ الفرق بين طبيعة األوامر الثالثة ونتائجها في المثال السابق!!
Page | 2
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
مالحظة :
بالرغم أن Tلها نفس معنى ، TRUEو Fلها نفس معنى FALSEفي البرنامج ، Rإال أنه
يفضل استخدام الكلمة كاملة .
مالحظات:
-1ليس من الضروري كتابة ”= “nrowو ”= ، “ncolيكفي فقط كتابة عدد الصفوف ومن ثم عدد
األعمدة ،والمثال التالي يوضح طريقتين لتعريف عدد الصفوف وعدد األعمدة.
)> mat<-matrix(10:15,3,2
> mat
][,1] [,2
[1,] 10 13
[2,] 11 14
[3,] 12 15
Page | 3
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
))> mat<-matrix(10:15,c(3,2
> mat
][,1] [,2
[1,] 10 13
[2,] 11 14
[3,] 12 15
الحظ في األمر األول حددنا فقط عدد الصفوف ،3وعدد األعمدة ،2وفي األمر الثاني عرفنا عدد
الصفوف وعدد األعمدة في متجه ). c(3,2
-2ليس من الضروري تحديد عدد الصفوف وعدد األعمدة معاً في أمر المصفوفة عند تكوينها في ،R
والمثال التالي يوضح ذلك.
1 −2 0
(=𝐴. مثال :في هذا المثال سوف نستخدم المصفوفة )
2 3 4
)> mat<-matrix(c(1,-2,0,2,3,4),nrow=3
> mat
][,1] [,2
[1,] 1 2
[2,] -2 3
[3,] 0 4
)> mat<-matrix(c(1,-2,0,2,3,4),ncol=3
> mat
][,1] [,2] [,3
[1,] 1 0 3
[2,] -2 2 4
)> mat<-matrix(c(1,-2,0,2,3,4),3
> mat
][,1] [,2
[1,] 1 2
[2,] -2 3
[3,] 0 4
)> mat<-matrix(c(1,-2,0,2,3,4),2
> mat
][,1] [,2] [,3
[1,] 1 0 3
[2,] -2 2 4
Page | 4
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
يمكن تعريف المصفوفة باستخدام متجه واحد فقط ،أو عدة متجهات.
أوال :تعريف المصفوفة باستخدام متجه واحد فقط
يمكن استعمال متجه واحد يحتوي على كل عناصر المصفوفة لتعريف المصفوفة باستعمال األمر التالي:
مثال :
)> vec<-c(3,2,4,5,6,-1
)> mat1<-matrix(vec,nrow=3,ncol=2,byrow=TRUE
> mat1
][,1] [,2
[1,] 3 2
[2,] 4 5
[3,] 6 -1
مالحظة:
إذا لم يتم استعمال byrow=TRUEفي المثال السابق ،فإن البرنامج سيقوم بقراءة المتجه على هيئة
وعرْفنا أن عدد األعمدة = ، 2وعدد الصفوف
أعمدة .أي أنه إذا كان المتجه يحتوي على 6عناصرَّ ،
= ، 3فإن البرنامج سيقوم بقراءة العناصر الثالثة األولى كعمود أول ،والعناصر الثالثة األخيرة كعمود
ثاني.
مثال :طبق التالي في ، Rوالحظ الفرق بنفسك !!
)> mat1<-matrix(vec,nrow=3,ncol=2,byrow=TRUE
> mat1
][,1] [,2
[1,] 1 2
[2,] 3 4
Page | 5
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
[3,] 5 6
)> mat2<-matrix(vec,nrow=3,ncol=2
> mat2
][,1] [,2
[1,] 1 4
[2,] 2 5
[3,] 3 6
يمكن تعريف عدة متجهات ،ومن ثم دمجها مع بعض لتكوين مصفوفة باستعمال األمرين ، cbind
. rbind
بالنسبة لألمر cbindفإنه يقوم بربط المتجهات مع بعضها عمودياً في مصفوفة ،أي أنه يتم وضع
المتجه األول كعمود أول ،والمتجه الثاني كعمود ثاني ،وهكذا ...أما بالنسبة لألمر rbindفيقوم بربط
المتجهات كصفوف للمصفوفة .
مثال :لتكن ) ، c3=(2,4,6) ، c2=(5,-1,2) ، c1=(3,2,4كون مصفوفة باستخدام
المتجهات السابقة ،باستعمال األمرين . rbind ، cbind
الحل :
)> vec1<-c(3,2,4
)> vec2<-c(5,-1,2
)> vec3<-c(2,4,6
)> mat3<-matrix(cbind(vec1,vec2,vec3),nrow=3,ncol=3
)> mat4<-matrix(rbind(vec1,vec2,vec3),nrow=3,ncol=3
> mat3
][,1] [,2] [,3
[1,] 3 5 2
[2,] 2 -1 4
[3,] 4 2 6
> mat4
][,1] [,2] [,3
[1,] 3 2 4
[2,] 5 -1 2
[3,] 2 4 6
مالحظات:
Page | 6
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
-1يمكن تعريف المتجه الذي يحتوي على عناصر المصفوفة في نفس أمر المصفوفة والمثال التالي
يوضح ذلك:
مثال :
)> mat<-matrix(c(1,2,0,-1,2,3,4,2,1),nrow=3,ncol=3
> mat
][,1] [,2] [,3
[1,] 1 -1 4
[2,] 2 2 2
[3,] 0 3 1
))> mat1<-cbind(c(1,-2,0),c(3,2,-2),c(4,-2,3
> mat1
][,1] [,2] [,3
[1,] 1 3 4
[2,] -2 2 -2
[3,] 0 -2 3
))> mat2<-rbind(c(1,-2,0),c(3,2,-2),c(4,-2,3
> mat2
][,1] [,2] [,3
[1,] 1 -2 0
[2,] 3 2 -2
[3,] 4 -2 3
Page | 7
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
الحظ أنه إذا قمت بربط مصفوفتين غير متوافقتين فإنه سوف تتحصل على رسالة خطأ .حاول أن تحرب
بنفسك
-3يمكن معرفة نوع ( بعد ) المصفوفة باستخدام األمر )( .dimويستخدم األمر )( nrowلمعرفة عدد
الصفوف فقط ،بينما يستعمل األمر)( ncolلمعرفة عدد األعمدة فقط في أي مصفوفة.
مثال:
)> mat1<-matrix(c(2,-4,-1,0,4,6,-1,3,4,6,1,2),ncol=4
> mat1
][,1] [,2] [,3] [,4
[1,] 2 0 -1 6
[2,] -4 4 3 1
[3,] -1 6 4 2
)> dim(mat1
[1] 3 4
)> ncol(mat1
[1] 4
)> nrow(mat1
[1] 3
-4يستخدم األمر )( tإليجاد محورة المصفوفة في .R
3 4 0
.𝐴 = (2 2 مثال :أوجد محورة المصفوفة التالية1) :
5 1 5
))> mat<-cbind(c(3,2,5),c(4,2,1),c(0,1,5
)> tmat<-t(mat
> tmat
][,1] [,2] [,3
[1,] 3 2 5
[2,] 4 2 1
[3,] 0 1 5
يستخدم الرمز ( )+لعملية جمع مصفوفتين أو أكثر ،ويستخدم الرمز(–) في عملية طرح المصفوفات.
أما بالنسبة لضرب مصفوفتين فيستخدم الرمز (*) لضرب عدد قياسي في مصفوفة بينما يستخدم الرمز
( ) %*%لضرب مصفوفة في مصفوفة.
Page | 8
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
الحل:
)> vec1<-c(1,3,2,0,0,1,-3,2,-1); vec2<-c(-3,0,2,-2,2,1,-1,3,3
)> mata<-matrix(vec1,nrow=3,ncol=3,byrow=TRUE
)> matb<-matrix(vec2,nrow=3,ncol=3,byrow=TRUE
> mata+matb # To find A+B
][,1] [,2] [,3
[1,] -2 3 4
[2,] -2 2 2
[3,] -4 5 2
> mata%*%matb # To find AB
][,1] [,2] [,3
[1,] -11 12 11
[2,] -1 3 3
[3,] 6 1 -7
> 2*mata # To find 2A
][,1] [,2] [,3
[1,] 2 6 4
[2,] 0 0 2
[3,] -6 4 -2
)> tatb<-t(mata)%*%t(matb)# To find t(A)t(b
> tatb
][,1] [,2] [,3
[1,] -9 -5 -10
[2,] -5 -4 3
[3,] -8 -3 -2
)> dim(mata # To find the dimension of A
[1] 3 3
مالحظات:
-1من المعلوم أنه يتم جمع المصفوفات من نفس النوع ،بينما يتم ضرب مصفوفتين إذا كانتا متوافقتين
أي إذا كان عدد أعمدة المصفوفة األولى يساوي عدد صفوف المصفوفة الثانية ،واذا لم يتحقق هذا الشرط
فإن البرنامج يعطيك رسالة خطأ تخبرك بأن المصفوفتين غير متوافقتين.
Page | 9
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
مثال:
الحل:
)> mata<-matrix(c(-1,0,2,1,3,4),3,byrow=TRUE
)> matb<-matrix(c(-2,3,0,-1,0,2),3,byrow=TRUE
)> crossprod(mata,matb
][,1] [,2
[1,] 2 1
[2,] 0 7
)> crossprod(mata,mata
][,1] [,2
[1,] 14 14
[2,] 14 17
يستخدم األمر )( rowSumsإليجاد مجموع كل صف على حدة ،بينما يستخدم األمر )(colSums
إليجاد مجموع كل عمود على حدة.أما إليجاد المتوسط الحسابي لكل صف ولكل عمود فيستخدم لذلك
األمرين )( rowMeansو )( colMeansعلى التوالي.
الحل:
)> vec1<-c(1,4,3); vec2<-c(2,6,7); vec3<-c(3,8,9
)> mat<-matrix(cbind(vec1,vec2,vec3),nrow=3,ncol=3
> # To find the sum of each row #
)> sr<-rowSums(mat
> sr
[1] 6 18 19
> # To find the sum of each column #
)> sc<-colSums(mat
> sc
[1] 8 15 20
> # To find the mean of each row #
)> mr<-rowMeans(mat
> mr
[1] 2.000000 6.000000 6.333333
> # To find the mean of each column #
)> mc<-colMeans(mat
Page | 11
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
> mc
[1] 2.666667 5.000000 6.666667
مالحظة:
يمكن قراءة العناصر في المصفوفة باستعمال اسم المصفوفة واإلشارة إلى رقم الصف والعمود كالتالي
. Name of matrix[i,j]:أيضاً يمكننا معرفة عناصر الصف iباستعمال األمر name of
] ، matrix[i,أما لمعرفة عناصر العمود jفنستعمل األمر ]. name of matrix[,j
1 3 2
𝐴 = (−2فعرف المصفوفة 𝐴 باستخدام األمر )( cbindتحت مسمى مثال :إذا كانت )−1 0
4 2 1
matومن ثم أوجد:
-1العنصر x3,2في المصفوفة . mat
-2عناصر العمود الثاني في المصفوفة . mat
-3عناصر الصف الثالث في المصفوفة . mat
الحل:
)> vec1<-c(1,-2,4
)> vec2<-c(3,-1,2
)> vec3<-c(2,0,1
)> mat<-matrix(cbind(vec1,vec2,vec3),nrow=3,ncol=3
]> mat[3,2
[1] 2
]> mat[,3
[1] 2 0 1
]> mat[2,
[1] -2 -1 0
Page | 12
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
)> mat5<-matrix(c(2,1,-1,3),ncol=2,byrow=TRUE
)> mat6<-matrix(c(1,-1,2,3,1,1,3,4),ncol=3,byrow=TRUE
)> det(mat5
[1] 7
)> det(mat6
[1] 16
)> InvA<-solve(mat5
)> InvB<-solve(mat6
> InvA
][,1 ][,2
[1,] 0.4285714 -0.1428571
[2,] 0.1428571 0.2857143
> InvB
][,1 ][,2 ][,3
[1,] 0.5625 0.25 -0.0625
[2,] -0.4375 0.25 -0.0625
[3,] 0.1875 -0.25 0.3125
يمكن إجراء عدة عمليات في نفس األمر ،والمثال التالي يوضح ذلك.
Page | 13
إعداد :أ .منال خليفة حسن
أ .منال خليفة حسن برامج إحصائية ( Iلغة البرمجة ) R
قسم اإلحصاء /كلية العلوم /
غريان /جامعة الجبل الغربي :ليبيا
)> mat1<-matrix(c(1,-2,-2,2),nrow=2,ncol=2,byrow=TRUE
)> mat2<-matrix(c(3,-1,1,2),nrow=2,ncol=2,byrow=TRUE
))> solve(mat1+mat2%*%t(mat1
][,1 ][,2
[1,] -0.1538462 -0.3846154
[2,] -0.1923077 -0.2307692
> solve(mat2)%*%mat2
][,1 ][,2
[1,] 1 -5.551115e-17
[2,] 0 1.000000e+00
نعلم جيداً أنه عند ضرب المصفوفة في معكوسها فإن المصفوفة الناتجة هي مصفوفة الوحدة ،الحظ أنه
في المثال السابق وجود أرقام عشرية عند إيجاد 𝐵 𝐵−1نتيحة لخطأ التقريب وللتخلص من هذه األرقام
العشرية والحصول على قيم صحيحة نستعمل األمر) ( ، ceilingوهذا األمر يقرب العدد إلى أقرب
عدد صحيح كالتالي:
)> ceiling(solve(mat2)%*%mat2
][,1] [,2
[1,] 1 0
[2,] 0 1
الحل :
Page | 14
إعداد :أ .منال خليفة حسن
منال خليفة حسن.أ ) R ( لغة البرمجةI برامج إحصائية
/ كلية العلوم/ قسم اإلحصاء
ليبيا: جامعة الجبل الغربي/غريان
> mat1<-matrix(c(3,2,-1,0),nrow=2,byrow=TRUE)
> mat2<-matrix(c(2,1,0,3,2,0,0,0,4),3,byrow=TRUE)
> eigen(mat1)
$values
[1] 2 1
$vectors
[,1] [,2]
> eigen(mat2)
$values
$vectors
Page | 15
منال خليفة حسن. أ: إعداد