You are on page 1of 15

‫أ‪ .

‬منال خليفة حسن‬ ‫برامج إحصائية ‪ ( I‬لغة البرمجة ‪) R‬‬


‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫المتجهات والمصفوفات‬

‫تعريف المتجه في ‪:R‬‬

‫يمكن تعريف المتجه في ‪ R‬باستخدام األمر ) …‪ ، c(object1,object2,‬وتستعمل الفاصلة ( ‪) ,‬‬


‫للفصل بين األشياء التي يحتويها المتجه‪ ،‬حيث إنه من الممكن أن تكون هذه األشياء قيم عددية أو نص‬
‫( حروف أو أسماء) وفي هذه الحالة يجب وضع النص بين عالمتي التنصيص المفردة ' ' أو المزدوجة‬
‫" "‪.‬‬

‫بعض العمليات على المتجهات ‪:‬‬

‫‪ ‬يستعمل الرمز ‪ +‬للجمع‪ ،‬بينما يستعمل الرمز * لضرب عدد في متجه ولضرب متجه في متجه‪.‬‬
‫‪ ‬يستعمل األمر ) ( ‪ 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‬إال أنه‬
‫يفضل استخدام الكلمة كاملة ‪.‬‬

‫المصفوفات ‪Matrices :‬‬

‫تعريف المصفوفة في ‪:R‬‬

‫يستعمل األمر ) ‪ matrix (data,nrow=m,ncol=n‬لتعريف ( تكوين ) المصفوفة في ‪ R‬حيث‬


‫إن‪:‬‬
‫‪ :data‬تشير إلى عناصر المصفوفة‪ ،‬وفي األغلب يتم وضعها في متجه‪.‬‬
‫‪ :m‬تشير إلى عدد الصفوف‪.‬‬
‫‪ :n‬تشير إلى عدد األعمدة‪.‬‬
‫‪10 13‬‬
‫مثال ‪ :‬استخدم ‪ R‬في تعريف المصفوفة التالية‪𝐴 = (11 14) :‬‬
‫‪12 15‬‬
‫الحل‪:‬‬
‫)‪> mat<-matrix(10:15,nrow=3,ncol=2‬‬
‫‪> mat‬‬
‫]‪[,1] [,2‬‬
‫‪[1,] 10 13‬‬
‫‪[2,] 11 14‬‬
‫‪[3,] 12 15‬‬

‫مالحظات‪:‬‬
‫‪ -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‬‬
‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫بناء على عدد‬


‫في المثال أعاله عندما تمت كتابة عدد الصفوف فقط ‪ ،‬البرنامج حدد عدد األعمدة تلقائيا ً‬
‫عناصر المصفوفة التي تم إدخالها‪ ،‬وكذلك الحال إذا تم تحديد عدد األعمدة فقط ‪ ،‬ولكن في هذه الحالة‬
‫يجب استخدام =‪ ،ncol‬ألنه إذا اكتفيت بكتابة العدد فقط فسيعتبرها البرنامج هي عدد الصفوف‪.‬‬

‫يمكن تعريف المصفوفة باستخدام متجه واحد فقط ‪ ،‬أو عدة متجهات‪.‬‬
‫أوال ‪ :‬تعريف المصفوفة باستخدام متجه واحد فقط‬

‫يمكن استعمال متجه واحد يحتوي على كل عناصر المصفوفة لتعريف المصفوفة باستعمال األمر التالي‪:‬‬

‫)‪matrix(name of vector, ncol=n ,nrow=m, byrow=TRUE‬‬

‫مثال ‪:‬‬
‫)‪> 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‬‬

‫‪ -2‬يمكن دمج مصفوفتين باستخدام األمر )(‪ cbind‬و )(‪. rbind‬‬


‫‪2 4‬‬ ‫‪2 −1‬‬ ‫‪1 2 3‬‬
‫(=𝐶‬ ‫(=𝐵‪)،‬‬ ‫(=𝐴‪،‬و)‬ ‫مثال ‪) :‬‬
‫‪−1 3‬‬ ‫‪3 −2‬‬ ‫‪3 −1 0‬‬
‫الحل‪:‬‬
‫)‪> mat1<-matrix(c(1,2,3,3,-1,0),ncol=3, byrow=TRUE‬‬
‫)‪> mat2<-matrix(c(2,-1,3,-2),nrow=2,byrow=TRUE‬‬
‫)‪> mat3<-matrix(c(2,4,-1,3),ncol=2,byrow=TRUE‬‬
‫)‪> mat4<-cbind(mat1,mat2); mat5<-cbind(mat1,mat2,mat3‬‬
‫‪> mat4‬‬
‫]‪[,1] [,2] [,3] [,4] [,5‬‬
‫‪[1,] 1 2 3 2 -1‬‬
‫‪[2,] 3 -1 0 3 -2‬‬
‫‪> mat5‬‬
‫]‪[,1] [,2] [,3] [,4] [,5] [,6] [,7‬‬
‫‪[1,] 1 2 3 2 -1 2 4‬‬
‫‪[2,] 3 -1 0 3 -2 -1 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‬‬
‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫‪−3 0 2‬‬ ‫‪1‬‬ ‫‪3‬‬ ‫‪2‬‬


‫‪ ، 𝐴 = ( 0‬و )‪ 𝐵 = (−2 2 1‬فأوجد 𝐵 ‪2𝐴 ، 𝐴𝐵 ، 𝐴 +‬‬ ‫‪0‬‬ ‫مثال ‪ :‬إذا كانت ) ‪1‬‬
‫‪−1 3 3‬‬ ‫‪−3‬‬ ‫‪2‬‬ ‫‪−1‬‬
‫‪.A‬‬ ‫‪ 𝐴𝑇 𝐵𝑇 ،‬نوع المصفوفة‬

‫الحل‪:‬‬
‫)‪> 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‬‬
‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫مثال‪ :‬أدخل المصفوفتين التاليتين في ‪ R‬ومن ثم أوجد 𝐵 ‪. 𝐵𝐴 ، 𝐴 +‬‬


‫‪−3‬‬ ‫‪0‬‬
‫‪1 3‬‬
‫‪𝐴 = (−2‬‬ ‫)‪2‬‬ ‫( = 𝐵‪,‬‬ ‫)‬
‫‪2 0‬‬
‫‪−1‬‬ ‫‪3‬‬
‫الحل‪:‬‬
‫)‪> mat1<-matrix(c(-3,0,-2,2,-1,3),nrow=3,ncol=2,byrow=TRUE‬‬
‫)‪> mat2<-matrix(c(1,3,2,0),nrow=2,ncol=2,byrow=TRUE‬‬
‫‪> mat1+mat2‬‬
‫‪Error in mat1 + mat2 : non-conformable arrays‬‬
‫‪> mat2%*%mat1‬‬
‫‪Error in mat2 %*% mat1 : non-conformable arguments‬‬
‫الحظ في نتيجة البرنامج أعاله تحصلنا على رسالة تفيد بأن المصفوفتين غير متوافقتين سواء في عملية‬
‫الجمع أو الضرب‪.‬‬
‫‪ -2‬إذا قمت بضرب مصفوفتين باستخدام الرمز * فإنه سيتم ضرب العناصر المتقابلة فقط‪ ،‬ومن النادر‬
‫اإلحتياج لهذا النوع من الضرب‪.‬‬

‫مثال‪ :‬الحظ الفرق في هذا المثال‪.‬‬


‫)‪> mat1<-matrix(c(1,3,-2,-1),ncol=2‬‬
‫)‪> mat2<-matrix(c(0,-1,4,5),ncol=2‬‬
‫‪> mat1*mat2‬‬
‫]‪[,1] [,2‬‬
‫‪[1,] 0 -8‬‬
‫‪[2,] -3 -5‬‬
‫‪> mat1%*%mat2‬‬
‫]‪[,1] [,2‬‬
‫‪[1,] 2 -6‬‬
‫‪[2,] 1 7‬‬
‫‪ -3‬إذا كان لدينا مصفوفتين ‪ A‬و‪ B‬فإنه يمكن إستخدام األمر )(‪ crossprod‬إليجاد 𝐵 ‪.𝐴′‬‬

‫مثال‪:‬‬

‫‪−2 −1‬‬ ‫‪−1‬‬ ‫‪0‬‬


‫‪ ، 𝐵 = ( 3‬فأوجد 𝐵 𝐴 ‪.𝐴 𝐴 ،‬‬
‫‪′‬‬ ‫‪′‬‬
‫‪،𝐴=( 2‬و) ‪0‬‬ ‫إذا كانت )‪1‬‬
‫‪0‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬
‫‪Page | 10‬‬
‫إعداد ‪ :‬أ‪ .‬منال خليفة حسن‬
‫أ‪ .‬منال خليفة حسن‬ ‫برامج إحصائية ‪ ( 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‬على التوالي‪.‬‬

‫‪1 2‬‬ ‫‪3‬‬


‫‪ 𝐴 = (4 6‬فأوجد المجموع والمتوسط الحسابي لكل صف وكل عمود‪.‬‬ ‫مثال‪ :‬إذا كانت )‪8‬‬
‫‪3 7‬‬ ‫‪9‬‬

‫الحل‪:‬‬
‫)‪> 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‬‬
‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫محدد المصفوفة ومعكوس المصفوفة‬


‫أوال‪ :‬محدد المصفوفة‬

‫يستعمل األمر ) (‪ det‬إليجاد محدد المصفوفة ‪.‬‬


‫مثال ‪ :‬أوجد محدد المصفوفتين التاليتين‪:‬‬

‫‪1 −1‬‬ ‫‪0‬‬


‫‪2 1‬‬
‫(=𝐴‬ ‫)‬ ‫‪, 𝐵 = (2 3‬‬ ‫)‪1‬‬
‫‪−3 5‬‬
‫‪1 3‬‬ ‫‪4‬‬
‫الحل‪:‬‬

‫)‪> 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‬‬
‫قسم اإلحصاء ‪ /‬كلية العلوم ‪/‬‬
‫غريان‪ /‬جامعة الجبل الغربي‪ :‬ليبيا‬

‫‪3 −1‬‬ ‫‪1‬‬ ‫‪−2‬‬


‫( = 𝐵 فأوجد ‪.𝐵−1 𝐵 ، (𝐴 + 𝐵𝐴𝑡 )−1‬‬ ‫(=𝐴 و)‬ ‫مثال‪ :‬إذا كانت )‬
‫‪1 2‬‬ ‫‪−2‬‬ ‫‪2‬‬
‫الحل‪:‬‬

‫)‪> 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‬‬

‫القيم الذاتية والمتجهات الذاتية‬

‫يستخدم األمر ) (𝑛𝑒𝑔𝑖𝑒 إليجاد القيم الذاتية والمتجهات الذاتية ‪.‬‬

‫مثال ‪ :‬أوجد القيم الذاتية والمتجهات الذاتية لكل من‪:‬‬

‫‪2‬‬ ‫‪1 0‬‬


‫‪3 2‬‬
‫(=𝐴‬ ‫‪) , 𝐵 = (3‬‬ ‫)‪2 0‬‬
‫‪−1 0‬‬
‫‪0‬‬ ‫‪0 4‬‬

‫الحل ‪:‬‬

‫‪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)

# calculate eigenvalues and eigenvetors of matrix A#

> eigen(mat1)

$values

[1] 2 1

$vectors

[,1] [,2]

[1,] 0.8944272 -0.7071068

[2,] -0.4472136 0.7071068

# calculate eigenvalues and eigenvetors of matrix A#

> eigen(mat2)

$values

[1] 4.0000000 3.7320508 0.2679492

$vectors

[,1] [,2] [,3]

[1,] 0 0.5000000 -0.5000000

[2,] 0 0.8660254 0.8660254

[3,] 1 0.0000000 0.0000000

Page | 15
‫ منال خليفة حسن‬.‫ أ‬: ‫إعداد‬

You might also like