الـمـصـفـوفـات

في هذا القسم ...
إنشاء مصفوفة "
" استدعاء عناصر من مصفوفة "
" العمليات الأساسية في المصفوفات "
" عمليات متقدمة على المصفوفات "

المقدمة :

الماتلاب يتعامل مع كل البيانات على أنها مصفوفات , وبالتالي فهي اللبنة الأساسية له و لا بد من الوقوف عندها وفهم كافة تفاصيلها .
تتكون المصفوفة من عدد من الصفوف وعدد من الأعمدة حيث يرمز بمتحول ما لكل منهما وتستخدم المصفوفات  في كثير من التطبيقات الهندسية لحل المشاكل المعقدة , وعناصر المصفوفة ممكن أن تكون قيم حقيقية أو عقدية , ويرمز عادة للمصفوفة :
Matrixname(m,n)
 عدد الأسطر  و  nعدد الأعمدة
أنواع المصفوفات في الماتلاب :
1) المصفوفات الرقمية .
2) المصفوفات المحرفية (cell and structure array) .

أولاً :إنشاء مصفوفة :
لإنشاء مصفوفة بأربع عناصر في سطر واحد , أدخل العناصر و اترك بينها فاصلة(,) أو فراغ .
a = [1 2 3 4]
a =
1     2     3     4
لإنشاء مصفوفة بعدة أسطر نكتب :
[a = [1 2 3; 4 5 6; 7 8 10
نلاحظ أنه عندما نريد الانتقال من سطر لسطر لإدخال عناصر مصفوفة نضع فاصلة منقوطة  (;)وذلك كما هو موضح .
وهناك طرق أخرى لإنشاء المصفوفات باستخدام توابع خاصة  وهي :
1 – تشكيل مصفوفة واحدية     ones(m,n)
2 – تشكيل مصفوفة صفرية zeros(m,n)   
3 - تشكيل مصفوفة محايدة     eye(m,n) 
أمثلة :
1- إنشاء مصفوفة صفرية بثلاثة أسطر و عمود واحد :
(z = zeros(3,1
z =
0
0
0
2- إنشاء مصفوفة متزايدة  :
d=[0:5]
d =
     0     1     2     3     4     5


3- إنشاء مصفوفة بخطوة قدرها 2 :
 d=[0:2:6]
d =
     0     2     4     6
الأشعة :
ما الفرق بين الشعاع و المصفوفة ؟:
الأشعة هي مصفوفة ولكن إما بعمود واحد أو بسطر واحد 


  • شعاع أفقي :
a=[1 4 5 6]
a= 1 4 5 6

  • شعاع عامودي :
a=[1;4;5;6]
a=
1
4
5
6

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


[A = [3 4 4 3 ; 4 5 6 7 ; 5 6 7 4 ; 4 5 6 7
           

  • استدعاء عنصر من مصفوفة عن طريق رقم السطر و رقم العمود و ذلك بكتابة :
A(3,2)                   ans = 6
                          
وبطريقة مشابهة يمكن استدعاء عنصر من مصفوفة حسب ترتيب العنصر , بكتابة :
A(8)                   ans = 5  
      
  • استدعاء سطر من مصفوفة.   
A(3,:)                 ans = 5  6  7  4 
  • استدعاء عمود من مصفوفة.




       







  • استدعاء السطر الثاني الذي يحوي العناصر الثلاثة الأخيرة منه 

  •                                                                                      
    A(2,2:4)                   ans = 5 6 7


    • استدعاء العنصر الأول والأخير من السطر الثالث.
    A(3,1:3:4)                ans = 5  4             
    • استدعاء مصفوفة جزئية من المصفوفة A الأساسية :
      A(1:2,3:4)                 ans=  4     3
                                                 6     7
      • إضافة عمود في نهاية المصفوفة.
      A(:,5) = [3 5 0 0]  


      A= 




        إضافة عمود جديد للمصفوفة الجديدة بحيث يكون العنصر الأخير من السطر الثالث 

      A(3,6) = 9  


       A=







      • حذف العمود الثاني من المصفوفة الجديدة.
      A(:,2) = [ ]  
      A=  
             




      • استبدال عنصر من المصفوفة بعنصر جديد.
      A(3,4) = 11
      A=





      • لاستدعاء آخر سطر من المصفوفة :
      A(end,:)

      ثالثاً :العمليات الأساسية على المصفوفات: 
      • العمليات الحسابية :

      1- الجمع +:
      a=[1 2] + [3 4]   
      a =
      [4    6]
      2- الطرح -:
      a=[3 4]-[1 2]
      a =
      [2    2]
      3-الضرب * :
       a=[1 2;3 4]*[3;6]
      a =
          15
          33
      4-القسمة / :
      a=[6 8]/2
      a =
           3     4
      5- رفع إلى قوة ^ :
      a=[1 2;3 4]^2
      a =
           7    10
          15    22
      لجعل العملية عملية ترتيبية أي معاملة كل عنصر بالعنصر المناظر له فقط , يجب وضع
      نقطة قبل رمز العملية المراد إجراؤها سواء كانت قسمة أو ضرب أو رفع لقوة ... 
      a=[1 2;3 4].^2                          
      a =
           1     4
           9    16
      —6- ايجاد منقول مصفوفة   : تبديل الأسطر بالأعمدة 
       a=[1 2;3 4]'
      a =
           1     3
           2     4
      الأمثلة :
      [a = [1 2 3; 4 5 6; 7 8 10


       a + 10
      ans =
      11   12   13
      14   15   16
      17   18    20

      (sin(a
      ans =
      0.8415     0.9093    0.1411
      -0.7568   -0.9589    -0.2794
      0.6570     0.9894     -0.5440

      رفع كل عنصر للأس 3 :
      a.^3
      ans =
      1          8        27
      64      125     216
      343     512    1000

       a=[9 16]./[3 4]
      a =
           3     4
       a=log([1 2])
      a =
               0    0.6931


      The format Function

        يتحكم في كيفية عرض الرقم , هناك عدة أشكال لعرض الرقم .
        كأمثلة على ذلك :
          x = [4/3  1.2345e-6]
        format short
         1.3333      0.0000


        format long

         1.33333333333333      0.00000123450000


        format bank

        1.33     0.00
        format rat
        4/3       1/810045
        format hex
        3ff5555555555555     3eb4b6231abfd271
        • الأعداد العقدية :
        العدد العقدي يتكون من القسم الحقيقي و التخيلي , لإيجاد الجذر التربيعي للعدد (-1)
        sqrt(-1)
        ans =
        0 + 1.0000i
        لتمثيل الجزء التخيلي يمكن استخدام إما i أو j

        c = [3+4i, 4+3j, -i, 10j]
        c =
        3.0000 + 4.0000i     4.0000 + 3.0000i      0 - 1.0000i        0 +10.0000i


        • العمليات المنطقية على المصفوفات :
          رمزها
          العملية
          1
          True
          0
          False
          &
          AND
          |
          OR
          NOT


          أمثلة توضح العمليات المنطقية :
          •  5>8                      ans=0
          • A=5<10                 A=1
          • x=0;y=1;                x&y                       
           ans =0
          • A=x|y                      A=1
          • ~x                           ans=1
          • (y&0)+(~x)+(0|y)     ans=2
            المصفوفات المحرفية : 
            تتم كتابتها باستخدام علامة تنصيص مفردة 
            s = 'Hello'
            داخلياً يتم تخزين الأحرف كأرقام 
            a = double(s)
            يتم تحويل المصفوفة المحرفية إلى مصفوفة رقمية وفق ترميز آسكي 
            و النتيجة تكون :
            a =
            72   101   108   108   111
            والتعليمة   (s = char(a  تعيد تحويلها لمصفوفة محرفية            
            v = [s; 'world']
            v =
            Hello
            world

            h = [s, ' world']

            h =
            Hello world
            لاستدعاء عناصر من المصفوفة v:
            v(2,3:5)
            ans =
            rld
            مصفوفة cell array :
            هي عبارة عن مجموعة من البيانات الممكن فهرستها تسمى مصفوفة الخلايا , أي خلية ممكن ان تحتوي على نوع من البيانات هذه البيانات ممكن أن تكون نصوص او محارف أو أرقام و بأحجام مختلفة .
            هناك طريقتان للإشارة إلى عناصر من مصفوفة الخلايا :
            () للإشارة إلى مجموعات من العناصر .
            {} للإشارة إلى نص أو أرقام أو معلومات داخل الخلايا الفردية .
            إنشاء مصفوفة الخلايا :
            لإنشاء مصفوفة خلايا نستخدم {} 
            myCell = {1, 2, 3;'text', rand(5,10,2), {11; 22; 33}}
            تعتبر هذه المصفوفة مصفوفة مستطيلة لها نفس العدد من الخلايا في كل صف . 
            مصفوفة الخلايا في مثالنا مصفوفة بسطرين و ثلاث أعمدة :
            myCell =
            [ 1]               [ 2]                         [ 3]

            'text'     [5x10x2 double]           {3x1 cell}

            يمكن إنشاء مصفوفة خلايا فارغة ( 0-0 )BYTE 
            C = {}
            في حال كنت تخطط لإضافة مجموعة من الخلايا مع مرور الوقت يمكنك إنشاء مصفوفة فارغة ذات بعد (N) وفق التعليمة التالية :
            emptyCell = cell(3,4,2)
            emptyCell is a 3-by-4-by-2 cell array
            بحيث كل خلية تحتوي مصفوفة فارغة ,[] :
            emptyCell(:,:,1) =
            []  []  []  []
            []  []  []  []
            []  []  []  []
            استدعاء العناصر من مصفوفة الخلايا 
            لتكن مصفوفة الخلايا

            C = {'one', 'two', 'three';
            1, 2, 3};

            استدعاء عناصر من مصفوفة cell array :
            upperLeft = C(1:2,1:2)
            creates a 2-by-2 cell array:
            upperLeft =
                               'one'     'two'

                               [ 1]        [ 2]


            تحديث مجموعات من الخلايا عن طريق استبدالها بنفس العدد من الخلايا :
            C(1,1:3) = {'first','second','third'}
            C =
            'first'    'second'   'third'

            [ 1]          [ 2]        [ 3]


            إذا كانت الخلايا في المصفوفة  تحتوي على البيانات الرقمية، يمكنك تحويل الخلايا إلى مصفوفة رقمية باستخدام وظيفة cell2mat:
            numericCells = C(2,1:3)

            numericVector = cell2mat(numericCells)


            numericCells is a 1-by-3 cell array, but numericVector is a 1-by-3 array oftype double:

            numericCells =
                                  [1]   [2]   [3]
            numericVector =
                                   1     2      3
            لتكن لدينا المصفوفة :
            C = {1, 2, 3};
            لإضافة خلية للمصفوفة نكتب :
            C{4,4} = 44
            C =
            [1]  [2]  [3]  []
             []    []    []   []
             []    []    []   []
             []    []    []   [44]

            رابعاً : عمليات أخرى على المصفوفات
            تتيح لنا بعض التوابع إمكانية الحصول على خصائص المصفوفة , كما تتيح توابع أخرى إمكانية إعادة تشكيل المصفوفة أو تدويرها.
            فمثلاً :

            التابع (disp(var : يقوم بإظهار محتوى شعاع.
            disp(var)
            التابع size يعيد مصفوفة تحوي قيمتين الأولى تمثل عدد أسطر المصفوفة بينما القيمة الثانية تمثل عدد الأعمدة.
            size (matrix name)
            التابع length بإعادة مصفوفة تحوي قيمة واحدة تمثل طول أطول سلسلة في المصفوفة و يستخدم هذا الأخير غالباً مع المصفوفات الشعاعية التي تكون عبارة عن سطر واحد و ذلك لمعرفة عدد عناصر هذا الشعاع.
            length(matrix name)
             التابع reshape يسمح بإعادة تشكيل المصفوفة فيمكن مثلاً تحويل المصفوفة من سطرين و عمود إلى عمودين و سطر و هكذا.
            reshape (matrix name ,m,n)
            حيث m عدد الأسطر و n عدد الأعمدة .
            تابع rot90 تدوير المصفوفة .
            rot90(matrix name)   

            تابع fliplr and flipud : يسمح بقلب عناصر المصفوفة( يمين /يسار )و كذلك (فوق / تحت ).
             flipud (matrix name) 

            تابعrandrandirandn: حيث تابع rand يقوم بتوليد أرقام عشوائية تتراوح بين (0,1).

            تابع randi يقوم بتوليد أرقام عشوائية بين (k,l) وتابع randn.
             rand(m,n)
             randi([k l],m,n)
             randn(m,n)
            تابع find (تعبير منطقي) : توجد تموضع العنصر الذي يلبي الشرط المنطقي.
            find(x)
            تابع hist : يقوم برسم الهيستوغرام (التوزع للأعداد ).


            أمثلة عملية :
            >>hist(randn(1000,1))

            >>var=[1 2 3;4 7 8]
            >>disp(var)                                                                 


            >>A=reshape([1 2; 3 4],1,4)
            A=
            1  3  2  4

            >>A=fliplr([1 2; 3 4])

            A =
                2     1

                4     3


            >>—A=randi([5 10],4,3)
            A =
              9     8     10
             10     5    10
              5      6     5
             10     8     10


            >>a=[1 2 7 9 0 7]
            b=find(a==7)
            b =
              3     6

            • بعض التوابع الخاصة المساعدة لإنشاء المصفوفات  
             إنشاء مصفوفة متزايدة خطياً معلوم عدد عناصرها
            >> linspace(a,b,c)
                  a القيمة البدائية       b القيمة النهائية        c عدد عناصر المصفوفة

             إنشاء مصفوفة متزايدة لوغاريتمياً معلوم عدد عناصرها
            >> logspace(a,b,c)
                 a القيمة البدائية            b القيمة النهائية        c عدد عناصر المصفوفة                        
             إنشاء مصفوفة سحرية
            >>magic(d)
             حيث d أبعاد المصفوفة               
            تحقق هذه المصفوفة أن :
            مجموع عناصر كل عمود يساوي مجموع عناصر كل سطر و يساوي مجموع عناصر القطر الرئيسي.


            مثال :
            >> m=magic(4)
            m =
                16     2     3    13
                 5    11    10     8
                 9     7     6    12
                 4    14    15     1
            >> sum(m)
            ans =
                34    34    34    34
            >> sum(m,2)
            ans =
                34
                34
                34
                34
            >> sum(diag(m))
            ans =
                34
            توابع مفيدة في التعامل مع المصفوفات :
            [A=[1 2 -3;-9 5 1;7 6 0

            (Max(A
            إيجاد أكبر عنصر في العامود
            (Min(A
            إيجاد أصغر عنصر في العامود
            (Mean(A
            إيجاد المتوسط الحسابي
            (sum(A
            إيجاد مجموع عناصر كل عامود
            (Std(A
            إيجاد الانحراف المعياري
            (Median(A
            إيجاد الوسيط
            (Diag(A
            إيجاد عناصر القطر الرئيسي
            (Trace(A
            إيجاد مجموع عناصر القطر الرئيسي
            (Sort(A
            ترتيب العناصر تصاعديا بالنسبة للأعمدة
            (Diff(A
            الفرق بين كل صف و الذي قبله


            المتغيرات في ال workspace :
            بيئة العمل تحوي على المتغيرات التي تم انشاؤها داخل الماتلاب أو تم استيرادها من ملفات البيانات أو برامج أخرى
            وكمثال سننشئ متغيرات
            A = magic(4);
            B = rand(3,5,2);
            من خلال التعليمة whos بامكاننا معرفة كل المتغيرات الموجودة ضمن ساحة العمل :
            whos

            Name    Size    Bytes   Class      Attributes
            A          4x4     128      double
            B         3x5x2    240     double
            كما تظهر المتغيرات مباشرة في ساحة العمل كما في الصورة :



            وهذه المتغيرات تنحذف مع انهاء برنامج الماتلاب, لذلك لا بد من حفظها باللأمر حفظ

            save myfile.mat
            لحذف كل المتغيرات من ساحة العمل بتعليمة :
            clear all
            لحذف متغير واحد ليكن x من ساحة العمل بتعليمة :
            clear x
            لتنظيف نافذة الأوامر بتعليمة :
            clc
            لاستعادة معلومات من MAT-file إلى ساحة العمل باستخدام تعليمة :

            load myfile.mat


            لاحظ :
            1-لا نحتاج في الماتلاب الى تعريف المتحولات (المصفوفات) التي نستخدمها في برامجنا ,كما أننا لا نحتاج لتحديد نوع المتحولات (المصفوفات) و لا أبعادها 
            عندما نولد عنصرا جديدا في الماتلاب, يقوم الماتلاب أوتوماتيكياً بتوليد مصفوفة هذا المتغير و يحجز الذاكرة المناسبة له , وإذا كان المتحول موجود سابقا في ال WORKSPACE فإن الماتلاب يقوم بتغيير خصائص هذا المتغير ويأخذ خصائص جديدة (أبعاد , حجم ذاكرة , نوع عنصر) على سبيل المثال عند كتابة  student=25 ينشئ مصفوفة (1*1) ويخزن فيها العدد 25 وبالتالي نوعها int
            أما بكتابة السطر 'student ='25 يقوم الماتلاب بتغيير الخصائص و تصبح ابعاد المصفوفة (2*1)و يخزن فيها سلسلة المحارف 25 وتكون نوعها char.
            2- الماتلاب يتحسس لحالة الحرف الصغير و الكبير  لذلك يجب الانتباه لهذه النقطة. 

            يمكنك الإطلاع على أنواع أخرى من التوابع الخاصة بالمصفوفات في الرابط التالي: هناقم بمحاولة تنفيذ كل تابع في الماتلاب و ناقش النتائج. 
            يمكنكم مشاهدة الفيديو التالي الذي يتم فيه شرح المصفوفات الخلوية cell array في مقدمة بسيطة.




            أخـيـراً اتـمـنـى لـكـم مـشـاهـدة مـمـتـعـة لـهـذا الـدرس