التعامل مع المصفوفات فى برنامج الماتلاب


#1

العمليات الرياضية الأساسية علي المصفوفات :

تعرفنا فيما سبق علي كيفية إجراء العمليات الحسابية الأساسية علي قيم عددية مفردة Scalars كالجمع والطرح والضرب والقسمة من اليمين ومن اليسار والرفع إلي أس .

وبنفس الكيفية يمكننا برنامج MATLAB من إجراء العمليات الرياضية الأساسية علي المصفوفات Matrices كالجمع والطرح والضرب والقسمة من اليمين ومن اليسار والرفع إلي أس (إيجاد المصفوفة الأسية ) وكأنها قيم عددية مفردة Scalars .

ولكن هذه العمليات تعتمد علي مجموعة من القواعد ( علي عكس المعتاد كيف تتم عملية ضرب مصفوفتينعليه في العمليات الحسابية العادية ) التي يتم تطبيقها علي القيم العددية المفردة Scalars كما ذكرنا فيما قبل ويطلق علي هذه القواعد جبر المصفوفات Matrices Algebraic .

ولنلخص المعاملات الحسابية التي تخص المصفوفات في الجدول التالي :

المعامل الرياضي

الوظيفة

الصيغة وفق برنامج MATLAB

المؤثر (+)

إجراء عملية الجمع علي الأعداد المفردة Scalars أو المصفوفات (التي لها نفس الأبعاد ) Same Size Matrices .

A+B

المؤثر (-)

إجراء عملية الطرح علي الأعداد المفردة Scalars أو المصفوفات (التي لها نفس الأبعاد ) Same Size Matrices .

A-B

المؤثر (*.)

إجراء عملية الضرب علي المتجهات أو المصفوفات (التي لها نفس الأبعاد ) Same Size Matrices عنصرا بعنصر Element By Element .

A.*B

المؤثر (/.)

إجراء عملية القسمة اليمني Right Divisionعلي المتجهات أو المصفوفات (التي لها نفس الأبعاد ) Same Size Matrices عنصرا بعنصر Element By Element .

A./B

المؤثر (.)

إجراء عملية القسمة اليسريLeft Divisionعلي المتجهات أو المصفوفات (التي لها نفس الأبعاد ) Same Size Matrices عنصرا بعنصر Element By Element .

A.B

المؤثر (^.)

إجراء عملية القسمة اليمني Right Divisionعلي المتجهات Vector أو المصفوفات  Matrices عنصرا بعنصر Element By Element .

A.^B

المؤثر (*)

إجراء عملية الضرب علي الأعداد المفردة Scalars أو المصفوفات  Matrices.

فلنفترض أن لدينا مصفوفتين A&B .

فشرط ضربهما هو أن يكون عدد أعمدة المصفوفة الأولي A يساوي عدد صفوف المصفوفة الثانية B أو أن يكون أحدهما عدد مفرد Scalar .

A*B

المؤثر (/)

إجراء عملية القسمة اليمني Right Devisionعلي الأعداد المفردة Scalars أو المصفوفات المربعة Square Matrices .

A/B

المؤثر ()

إجراء عملية القسمة اليسري left Devisionعلي الأعداد المفردة Scalars أو المصفوفات المربعة Square Matrices .

AB

المؤثر (^)

إجراء عملية الرفع إلي أس علي الأعداد المفردة Scalars أو المصفوفات المربعة Square Matrices .

A^B

جمع المصفوفات / المتجهات :

قبل البدء في إجراء عملية جمع مصفوفتين عدديتين , يشترط برنامج matlab أن يكون للمصفوفتين المراد جمعهما نفس عدد الصفوف m ونفس عدد الأعمدة n أو أن يكون أحدهما قيمة عددية مفردة scalar, علما بأن ناتج جمع المصفوفتين سيكون عبارة عن مصفوفة لها نفس الأبعاد (Mxn).

فعلي سيبل المثال المصفوفتان التاليتان A&b يمكن جمعهما لأنهما يحملان نفس عدد الصفوف
والأعمدة , لذا فيمكننا إجراء عملية جمع المصفوفتين علي الشكل التالي :

<< % defining anon square matrix [A]
<< A = [ 2  4; 6  8; 10 12]
A =
2      4
6       8
10      12
<< % defining anon square matrix [b]
<< B =[1 3;5  7; 9 11]
B =
1        3
5         7
9          11
<< % [c]  = [A] + [B]
<< c=A+B
c =
3          7
11         15
19          23

كيف تتم عملية جمع مصفوفتين :

تتم عملية الجمع , بجمع العنصر الأول في الصف الأول للمصفوفة a مع ما يناظره في المصفوفة B (العنصر الأول في الصف الأول في المصفوفة b) , وبالتالي نكون قد حصلنا علي العنصر الأول للصف الأول والعمود الأول للمصفوفة الجديدة c.

2+1 =3
وبالمثل لإيجاد العنصر الثاني في الصف الأول للمصفوفة c فنقوم بجمع العنصر الثاني في الصف الأول للمصفوفة A مع مايناظره في المصفوفة B (العصر الثاني في الصف الأول والعمود الثاني للمصفوفة B).

4+3 = 7
ونستمر هكذا حتي يتم الإنتهاء من إجراء عملية الجمع.
ملحوظة : يمكننا البرنامج من إجراء عملية جمع Addition process بين قيمة عددية مفردة Scalar ومصفوفة أخري A , لتتنتج مصفوفة لها نفس أبعاد المصفوفة A , بحيث يتم إضافة القيمة العددية المفردة إلي جميع عناصر المصفوفة Aعنصرا بعنصر Element By Element , كما في المثال التالي :

<< A= [2  4;6  8;  10  12];
<< c=A+3
C  =
5            7
9             11
13            15

وبنفس الطريقة السابقة لجمع مصفوفتين , يمكننا إجراء عملية الجمع علي المتجهات الصفيةالعمودية بشرط أن يكون لها نفس عدد العناصر , أو أن يكون أحدهما قيمة عددية مفردة Scalar لتضاف علي جميع عناصر المتجه عنصرا بعنصر Element By Element.

طرح المصفوفات :

يقوم برنامج MATALAB بعملية طرح المصفوفات بنفس قاعدة عملية جمع المصفوفات التي تعلمناها سويا حيث يشترط أن تكون المصفوفات التي يتم جمعها أو طرحها لها نفس الأبعاد m x n حيث ة هو عدد الصفوف وN هو عدد الأعمدة أو أن يكون أحدهما قيمة عددية مفردة Scalar علما بأن ناتج طرح المصفوفتين سيكون عبارة عن مصفوفة لها نفس الأبعاد (m x n).
فعلي سبيل المثال المصفوفتان التاليتان A&B يمكن طرحهما لأنهما يحملان نفس عدد الصفوف والأعمدة , لذا فيمكننا إجراء عملية طرح المصفوفتين علي الشكل التالي :

<<   % defining anon square matrix  [A]
<<  A= [2  4;6    8;10   12]
A =
2        4
6         8
10        12
<< B= [1  3;5  7;9  11]
B =
1    3
5     7
9      11
<<  % [c] = [a] – [B]
<< c =A-B
c =
1     1
1     1
1      1

كيف تتم عملية طرح مصفوفتين :

تتم عملية طرح مصفوفتين تماما مثل عملية الجمع , حيث يتم طرح العنصر الأول في الصف الأول للمصفوفة A مع ما يناظره في المصفوفة B (العنصر الأول في الصف الأول في المصفوفة B) وبالتالي نكون قد حصلنا علي العنصر الأول في الصف الأول والعمود الأول للمصفوفة الجديدة C وبالمثل لإيجاد العنصر الثاني في الصف الأول للمصفوفة C بطرح العنصر الثاني في الصف الأول للمصفوفة A مع ما يناظرة في المصفوفة B(العنصر ونستمر هكذا حتي يتم الإنتهاء من إجراء عملية الطرح).
ملحوظة : يمكننا البرنامج من إجراء عملية طرح Subtraction process قيمة عددية مفردة Scalar من جميع عناصر المصفوفة A, لتنتج مصفوفة لها نفس أبعاد المصفوفة A, بحيث يتم طرح القيمة العددية المفردة من جميع عناصر المصفوفة A عنصرا بعنصر Element By Element , كما في المثال التالي :

<< A=[2  4;6  8;10   12] ;
<< C =A-1
C =ٌ
1      3
5       7
9        11

وبنفس الطريقة السابقة لطرح مصفوفتين , يمكننا إجراء عملية الطرح علي المتجهات الصفيةالعمودية بشرط أن يكون لها نفس عدد العناصر , أو أن يكون أحدهما قيمة عددية مفردة Scalar لتضاف إلي جميع عناصر المتجه عنصرا بعنصر Element By Element.

ضرب المصفوفات :

تعلمنا سابقا أنه لكي تتم عملية جمع المصفوفات المتجهات العددية يشترط برنامج MATLAB تساوي أبعادها أو عدد عناصرها.
أما عند إجراء عملية ضرب مصفوفتين في برنامج MATLAB ولنفترض أن لدينا مصفوفتين A&B , فشرط ضربهما هو أن يكون عدد أعمدة المصفوفة الأولي A يساوي عدد صفوف المصفوفة الثانية B , كما هو موضح في المعادلة التالية :

حيث أن :
M : يمثل عدد صفوف المصفوفة الأولي [A] وn يمثل عدد أعمدتها.
N : يمثل عدد صفوف المصفوفة الثانية [B] و R يمثل عدد أعمدتها.
وبالفعل فقد تحقق شرط ضرب المصفوفتين A,B حيث أن عدد أعمدة المصفوفة الأولي [A] يساوي عدد صفوف المصفوفة الثانية [B] يساوي n.

مع ملاحظة أن المصفوفة الناتجة [C] عن عملية الضرب هي مصفوفة عدد صفوفها هو عدد صفوف المصفوفة الأولي [A] وعدد أعمدتها هو عدد أعمدة المصفوفة الثانية [B].

ولتوضيح كيفية إجراء عملية ضرب مصفوفتين , تابع المثال التالي :

  • قم بتعريف المصفوفة A وهي مصفوفة من الدرجة (3*2) كما يلي :

    << % defining anon square matrix [A]
    << A = [1 3 2 ;4 6 5]
    A =
    1 3 2
    4 6 5
    قم بتعريف المصفوفة b وهي مصفوفة من الدرجة (2*3) كما يلي :

    << % defining anon square matrix [B]
    << B=[2 1;3 2;7 1]
    B =
    2 1
    3 2
    7 1

نلاحظ من الخطوتين السابقتين أن عدد أعمدة المصفوفة الأولي [A] يساوي عدد صفوف المصفوفة الثانية [B] يساوي n مما يحقق شرط إجراء عملية الضرب للمصفوفتين B,A كما يلي :

<< % c=a*b
C  =
         25       9
          61       21

لنلاحظ أنه قد تم إجراء عملية الضربق وأن المصفوفة [c] الناتجة من عملية الضرب هي مصفوفة عدد صفوفها هو عدد صفوف المصفوفة الأولي [A] وعدد أعمدتها هو عدد أعمدة المصفوفة الثانية [b].

كيف تتم عملية ضرب مصفوفتين :

تتم عملية ضرب مصفوفتين بضرب عناصر الصف الأول من المصفوفة الأولي [a] في العناصر المناظرة لها في العمود الأول من المصفوفة الثانية [b] مع الجمع لينتج العنصر الأول (في الصف الأول والعمود الأول ) من المصفوفة [C] (مصفوفة ناتج عملية الضرب) , كما يلي :

  1*2+3*3+2+_7 = 25

وبالمثل يتم الحصول علي العنصر الثاني في الصف الأول والعمود الثاني للمصفوفة c بضرب عناصر الصف الأول من المصفوفة الأولي [a] في العناصر المناظرة لها في العمود الثاني من المصفوفة الثانية [B] مع الجمع , كما يلي :

   1*2+3*3+2*7 = 25

وبالمثل يتم الحصول علي العنصر الثاني في الصف الأول والعمود الثاني للمصفوفة c بضرب عناصر الصف الأول من المصفوفة الأولي [A] في العناصر المناظرة لها في العمود الثاني من المصفوفة الثانية [B] مع الجمع , كما يلي :

1*+3*2=2*1 = 9

ونستمر هكذا حتي يتم الإنتهاء من إجراء عملية ضرب المصفوفتين .
ملحوظة : ذكرنا أن الشرط اللازم توافره لضرب مصفوفتين هو أن يكون عدد أعمدة المصفوفة الأولي يساوي عدد صفوف المصفوفة الثانية وإلا سيقوم البرنامج بعرض رسالة خطأ تفيدك بعدم توافق أبعاد المصفوفتين لإجراء عملية الضرب كما في المثال التالي :

<< x =[1 3  5;2    4 6]
x  =
1      3    5
2      4     6
<< Y = [5  3   1;6  4  2]
Y  =
       5        3     1
       6        4      2
       <<  Z=X*Y
??? error    using  ==  <  mtimes
Inner  matrix  dimensions  must  agree.

ولكن قد يكون هدف المستخدم هو ضرب كل عنصر من عناصر المصفوفة الأولي في العنصر المناظر له في المصفوفة الثانية element by element multiplication , ويتحقق هذا بشرط أن يتساوي أبعاد المصفوفتين المراد ضرب عناصرها المتقابلة , وهذا محقق بطبيعة الحال في هذا المثال , أو أن يكون أحد المصفوفتين قيمة عددية مفردة Scalar وتتحقق هذه العملية بإضافة علامة النقطة (.)dot قبل علامة عملية الضرب (*) كما في المثال التالي :

<< z=x.*y
z =
     5          9       5
     12        16      12

وكما نلاحظ أننا حصلنا علي مصفوفة لها نفس أبعاد المصفوفتين X,Y , حيث تم ضرب كل عنصر من عناصر المصفوفة X في العنصر المناظر له في المصفوفة Y , لتنتج المصفوفةz والتي لها نفس أبعاد المصفوفتين Y,X , وينطبق ذلك أيضا علي عملية القسمة من اليسار إلي اليمين (القسمة اليسارية) أو القسمة العكسية من اليمين إلي اليسار (اليمينية) وعملية رفع المصفوفات إلي قوة.

وبالمثل يمكننا ضرب القيمة العددية المفردة 2 في كل عنصر من عناصر المصفوفة x بحيث تتم عملية الضرب عنصرا بعنصر element by element multiplication كما يلي :

<<  % w = 2. *x  = 2*x
<< w=2. *x
w  =
       2       6      10
       4       8       12

لنلاحظ بأن البرنامج قام بضرب القيمة العددية المفردة 2 في جميع عناصر المصفوفة X عنصرا بعنصر element by element multication لتنتج المصفوفة w التي لها نفس أبعاد المصفوفة X .

لذا فالعمليات الرياضية بين الأعداد المفردة scalars وبين المصفوفات matrices والمتجهات vectors(كالجمع والطرح والقسمة) تتم بطريقة طبيعية كما لو كانت عمليات رياضية بين أعداد مفردة فقط , حيث يقوم البرنامج ببساطة بتطبيق العملية الحسابية علي كافة عناصر المصفوفة كما في المثال التالي :

<<  x =[1  3  5;2  4  6];
<< 3*x2-1
ans  =
        0.5000         3.5000        6.5000
        2.000           5.0000        8.0000

وفيه يتم ضرب كل عنصر من عناصر X في العدد المفرد 3 ثم تقسيم كل من عناصر المصفوفة الناتجة علي العدد المفرد 2 وأخيرا يتم طرح 1 من كل عنصر من نتيجة العملية السابقة.

لاحظ أن العمليات الرياضية بين المصفوفات والأعداد المفردة تتبع نفس ترتيب الأولويات المستخدمة في التعبيرات الرياضية بين الأعداد المفردة , وأنه يمكن استخدام الأقواس عند الرغبة في تغيير ترتيب العمليات كما يلي :

<< 3* (X-1) 2
ans  =
                0        3.0000          6.0000
1.5000                4.5000          7.5000

وفيه يتم طرح العدد المفرد 1 من كل عنصر من عناصر المصفوفة X أولا ثم تقسيم كل من عناصر المصفوفة الناتجة علي العدد المفرد 2 وأخيرا يتم ضرب 3 في كل عنصر من نتيجة العملية السابقة.

ضرب المتجهات :

عند الشروع في إجراء عملية الضرب العادية بين متجهين صفيين, سيقوم البرنامج بعرض رسالة خطأ تفيدك بعدم إمكانية ضرب المتجهين لعدم توافق أبعادهما (لأن الشرط السابق ذكره لإجراء عملية الضرب لم ينطبق علي الكتجهين الصفيين) وهو أن يكون عدد أعمدة المصفوفة الأولي يساوي عدد صفوف المصفوفة الثانية , وهذا غير محقق في المثال التالي :

<< % defining a  row  vector  [X]
<< X = [1  3 5 7 9 ];
<<  % defining a row vector  [Y]
<< Y = [2  4  6  8  10];
<<  Z=X*Y
??? error using == <  mtimes
Inner matrix dimensions must agree.

في حين أنه بإمكاننا ضرب كل عنصر من عناصر المتجه X في العنصر المناظر له في المتجه Y , ولكن يجب أن يكون الكتجهان X,Y المراد ضربهما لهما نفس الأبعاد , وهذا محقق بطبيعة الحال في هذا المثال أو أن يكون أحدهما قيمة عددية مفردة Scalar ولتنفيذ هذه العملية نقوم بإضافة نقطة (.) Dot قبل علامة عملية الضرب (*) كما يلي :

>> % Defining a Row Vector [X]
>> X= [ 1        3      5      7      9] ;
>> % Defining  a Row Vector [Y]
>> Y= [ 2        4      6      8      10] ;
>> Z=X.*Y
Z =
        2      12    30    56    90

وبالفعل نلاحظ أن قيم عناصر المتجه Z هي عبارة عن حاصل ضرب كل عنصر من عناصر المتجه X في نظيره من المتجه Y كما يلي :

Z(1) =X(1)*Y(1)
Z(2) =X(2)*Y(2)
Z(3) =X(3)*Y(3)

وبالمثل يمكننا ضرب القيمة العددية المفردة 3 في جميع عناصر المتجه الصفي X بحيث تتم عملية الضرب عنصرا بعنصر Element By Element Multiplication كما يلي :

>> W=3.*X
W =
        3      6      15    21    27

ملحوظة : يمكنك إجراء عملية الضرب بين متجهين بشرط أن يكون أحدهما متجه صفي Row Vector والأخر عمودي Column Vector وأن يكون لهما نفس عدد العناصر كما يلي :

>> % Defining a Row Vector [X] of 5 elements
>> X= [1         3      5      7      9] ;
>> % Defining a column vector [Y] of 5 elements
>> Y=[2;4;6;8;10] ;
>> % Z=X*Y
>> Z=X*Y
Z =
        190

قسمة المصفوفات :

يمكننا برنامج MATLAB من إجراء عملية القسمة بين مصفوفتين بشرط أن يكون كلا المصفوفتين مربعتين أو أن يكون أحدهما قيمة عددية مفردة ونقوم بإجراء عملية القسمة بإستخدام المؤثرين الرياضيين ("/" و “” )حيث يستخدم “/” وسمي slash لإجراء عملية القسمة اليسارية ( من اليسار إلي اليمين ) كما يستخدم المؤثر “” ويسمي Backslash لإجراء عملية القسمة اليمينية (من اليمين إلي اليسار ) أو العكسية حيث يتم فيها قسمة المقام علي البسط .
ولتوضيح كيفية إجراء عملية قسمة مصفوفتين تابع معي الأمثلة التالية :

  • قم بتعريف المصفوفتين المربعتين A,B كما يلي :

    % Defining a square matrix [A]
    A=[4 6 ;8 10] ;
    % Defining a square matrix [B]
    B= [2 3; 4 5] ;

  • قم بإجراء عملية القسمة (بإستخدام الرمز “/” ) كما يلي :

    % C=A/B
    C=A/B
    C =
    2 0
    0 2
    .
    لنلاحظ أن البرنامج قد قام بقسمة المصفوفة A كوحدة واحدة علي المصفوفة B كوحدة واحدة ولم يقم بقسمة كل عنصر من عناصر المصفوفة A علي العناصر المناظر له في المصفوفة B .
    ملحوظة : يستخدم معاملي القسمة الأيمن أو الأيسر للمصفوفة في حل المعادلات الخطية Solutions of system of linear equations كما يلي :

    A X =B
    X=B/A
    X = AB

  • كما يمكننا الحصول علي نفس ناتج القسمة السابقة بإستخدام دالة المعكوس inv أو برفع المصفوفة الي القوة (-1) كما يلي :

    % A/B = Ainv (B) = AB^-1
    D=A*inv (B)
    D =
    2 0
    0 2

    E=A*B^-1
    E =
    2 0
    0 2
    مع ملاحظة أن هذه العلاقات لا تتحقق إلا في حالة المصفوفات المربعة فقط ( المصفوفات التي يكون عدد صفوفها يساوي عدد أعمدتها ) ذات المعكوس .

  • قم بإجراء عملية القسمة العكسية (بإستخدام الرمز “” ) كما يلي :

    F=AB
    F =
    0.5000 0
    0 0.5000
    لنلاحظ أن البرنامج قد قام بالقسمة العكسية للمصفوفة A كوحدة واحدة علي المصفوفة B كوحدة واحدة ولم يقوم بالقسمة العكسية لكل عنصر من عناصر المصفوفة A علي العناصر المناظرة لها في المصفوفة B .

  • كما يمكننا الحصول علي نفس ناتج القسمة العكسية السابقة بإستخدام دالة المعكوس inv أو برفع المصفوفة إلي القوة (1-) كما يلي :

    % AB = inv (A) B = A^-1B
    G=inv (A) *B
    G =
    0.5000 0
    0 0.5000

    H=A^-1*B
    H =
    0.5000 0
    0 0.5000
    مع ملاحظة ان هذه العلاقات لا تتحقق إلا في حالة المصفوفات المربعة فقط (المصفوفات التي يكون عدد صفوفها يساوي عدد أعمدتها ) ذات المعكوس .

قسمة مصفوفتين عنصرا بعنصر :

في كثير من الأحيان قد يكون هدف المستخدم هو قسمة كل عنصر من عناصر المصفوفة الأولي علي العنصر المناظر له في المصفوفة الثانية ويتحقق هذا بشرط هو أن يتساوي أبعاد المصفوفتين المراد قسمة عناصرهما المتقابلة (مع عدم ضرورة توافر شرط أن يكونا كلا المصفوفتين مربعتين ) أو أن يكون أحدهما قيمة عددية مفردة Scalar وتتحقق هذه العملية بإضافة نقطة Dot(.) قبل علامتي عملية القسمة (/) أو () وتستخدم كما في المثال التالي :

>> % Defining a non square Matrix [A]
>> A=[4          9      64;16       25    81]
A=
        4      9      64
        16    25    81
>> % Defining a non square Matrix [B]
>> B=[2          3      8;4           5      9]
B=
        2      3      8
        4      5      9
>> % C=A./B (Dividing element by element)
>> C=A./B
C =
        2      3      8
        4      5      9
>> % C=A.B (Dividing element by element)
>> D=A./B
D =
        0.5000     0.3333     0.1250
        0.2500     0.2000     0.1111

مع ملاحظة أن النقطة Dot(.) التي تسبق معاملي القسمة ( الأمامية / أو العكسية ) تخبر برنامج MATLAB بأن يقوم بالقسمة عنصرا بعنصر element by element أما عملية القسمة دون استخدام نقطة فتعني قلب المصفوفات (إيجاد مقلوبها أو معكوسها ) كما تحثنا سابقا .

قسمة متجهين عنصرا بعنصر :

يمكننا برنامج MATLAB من قسمة كل عنصر من عناصر المتجه الأول علي العنصر المناظر له في المتجه الثاني ويتحقق هذا بشرط هو أن يتساوي عدد العناصر المتجهين المراد قسمة عناصرهما المتقابلة أو أن يكون أحدهما قيمة عددية مفردة Scalar ويتم ذلك بإضافة نقطة Dot(.) قبل علامتي عملية القسمة (/) أو () تماما مثل عملية قسمة مصفوفتين عنصرا بعنصر وبنفس هذه الطريقة يمكننا إجراء عملية قسمة متجهين عموديين عنصرا بعنصر بشرط تساوي عدد عناصر المتجهين المراد قسمة عناصرهما المتقابلة أو أن يكون أحدهما قيمة عددية مفردة Scalar .
ملحوظة : وجه الإختلاف بين المعاملات الحسابية Arithmetic operators للمصفوفات Matrices والمتجهات Vectors هو أن المعاملات الحسابية للمتجهات تسبقها علامة النقطة (.) Dot (لتدل هذه العلامة علي تنفيذ العملية عنصرا بعنصر element by element ) ماعدا معاملات عمليات الجمع والطرح .