ترتيب الصفوف والأعمدة

في مجال الحوسبة، يعتبر ترتيب الصفوف وترتيب الأعمدة من الطرق المستخدمة لتخزين المصفوفات متعددة الأبعاد في التخزين الخطي مثل ذاكرة الوصول العشوائي .
يكمن الفرق بين الترتيبين في موضع العناصر المتجاورة في الذاكرة. ففي ترتيب الصفوف، تكون العناصر المتتالية في الصف الواحد متجاورة، بينما ينطبق الأمر نفسه على العناصر المتتالية في العمود الواحد في ترتيب الأعمدة. ورغم أن المصطلحين يشيران إلى صفوف وأعمدة المصفوفة ثنائية الأبعاد، أي المصفوفة ، إلا أنه يمكن تعميمهما على المصفوفات من أي بُعد، مع ملاحظة أن مصطلحي "ترتيب الصفوف" و"ترتيب الأعمدة" يُكافئان الترتيب المعجمي والترتيب المعجمي المشترك على التوالي. وبما أن المصفوفات تُمثل عادةً كمجموعات من متجهات الصفوف أو الأعمدة، فإن استخدام هذا الأسلوب يُخزنها فعليًا كمتجهات متتالية أو مكونات متجهات متتالية. ويُشار إلى هذه الطرق لتخزين البيانات بـ AoS وSoA على التوالي.
يُعدّ تخطيط البيانات أمرًا بالغ الأهمية لتمرير المصفوفات بشكل صحيح بين البرامج المكتوبة بلغات برمجة مختلفة. كما أنه مهمٌّ للأداء عند اجتياز المصفوفة، لأن وحدات المعالجة المركزية الحديثة تعالج البيانات المتسلسلة بكفاءة أعلى من البيانات غير المتسلسلة. ويعود ذلك أساسًا إلى التخزين المؤقت لوحدة المعالجة المركزية الذي يستغلّ خاصية التوطين المكاني للمرجعية . [ 1 ] بالإضافة إلى ذلك، يُتيح الوصول المتجاور استخدام تعليمات SIMD التي تعمل على متجهات البيانات. في بعض وسائط التخزين، مثل أشرطة التخزين المغناطيسية ، يكون الوصول المتسلسل أسرع بكثير من الوصول غير المتسلسل.
شرح ومثال
مصطلحا "ترتيب الصفوف" و"ترتيب الأعمدة" مشتقان من المصطلحات المتعلقة بترتيب الكائنات. تتمثل الطريقة العامة لترتيب الكائنات ذات السمات المتعددة في تجميعها أولاً وترتيبها حسب سمة واحدة، ثم داخل كل مجموعة، يتم تجميعها وترتيبها حسب سمة أخرى، وهكذا. إذا شاركت أكثر من سمة في الترتيب، تُسمى الأولى " الرئيسية" والأخيرة "الثانوية" . أما إذا شاركت سمتان فقط في الترتيب، فيكفي تسمية السمة "الرئيسية" فقط.
في حالة المصفوفات، تكون السمات هي المؤشرات على طول كل بُعد. بالنسبة للمصفوفات في الترميز الرياضي، يشير المؤشر الأول إلى الصف ، ويشير الثاني إلى العمود ، على سبيل المثال، بالنظر إلى مصفوفة، المدخليقع في الصف الأول والعمود الثاني. وقد تم اعتماد هذا الاصطلاح في بناء الجملة في لغات البرمجة، [ 2 ] على الرغم من أن الفهارس تبدأ غالبًا من 0 بدلاً من 1. [ 3 ]
على الرغم من أن الصف يُشار إليه بالفهرس الأول والعمود بالفهرس الثاني ، إلا أن هذا لا يُشير إلى أي ترتيب تجميعي بين الأبعاد. لذا، فإن اختيار كيفية تجميع وترتيب الفهارس، سواءً باستخدام طريقة الصف أو العمود، هو مسألة اصطلاحية. ويمكن تطبيق المصطلحات نفسها على المصفوفات ذات الأبعاد الأعلى. يبدأ التجميع باستخدام طريقة الصف من الفهرس الأيسر ، بينما يبدأ التجميع باستخدام طريقة العمود من الفهرس الأيمن ، مما يؤدي إلى ترتيب معجمي وترتيب معجمي مشترك (أو معجمي) ، على التوالي.
على سبيل المثال، المصفوفة
يمكن تخزينها بطريقتين محتملتين:
| عنوان | ترتيب الصفوف الرئيسية | ترتيب الأعمدة |
|---|---|---|
| 0 | ||
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 |
تتعامل لغات البرمجة مع هذا الأمر بطرق مختلفة. في لغة C ، يتم تخزين المصفوفات متعددة الأبعاد بترتيب الصفوف، وتُكتب فهارس المصفوفة من الصف الأول (ترتيب الوصول المعجمي):
عنوانx + N_x*y | وصولA[y][x] | قيمة |
|---|---|---|
| 0 | A[0][0] | |
| 1 | A[0][1] | |
| 2 | A[0][2] | |
| 3 | A[1][0] | |
| 4 | A[1][1] | |
| 5 | A[1][2] |
من ناحية أخرى، في لغة فورتران ، يتم تخزين المصفوفات بترتيب الأعمدة، بينما لا تزال فهارس المصفوفة تُكتب من الصف الأول (ترتيب الوصول المعجمي):
عنوانy + N_y*(x-1) | وصولA(y,x) | قيمة |
|---|---|---|
| 1 | A(1,1) | |
| 2 | A(2,1) | |
| 3 | A(1,2) | |
| 4 | A(2,2) | |
| 5 | A(1,3) | |
| 6 | A(2,3) |
لاحظ كيف أن استخدام A[i][j]الفهرسة متعددة الخطوات كما في لغة C، على عكس الترميز المحايد كما A(i,j)في لغة Fortran، يُشير حتمًا تقريبًا إلى ترتيب الصفوف لأسباب نحوية، لأنه يُمكن إعادة كتابته على النحو التالي: ويمكن حتى إسناد جزء (A[i])[j]الصف A[i]إلى متغير وسيط يتم فهرسته لاحقًا في تعبير منفصل. (لا ينبغي افتراض أي دلالات أخرى، على سبيل المثال، لا تعتمد لغة Fortran على ترتيب الأعمدة لمجرد ترميزها ، بل يُمكن تجاوز الدلالة المذكورة أعلاه عمدًا في لغة جديدة).
لاستخدام ترتيب الأعمدة في بيئة تعتمد على ترتيب الصفوف، أو العكس، لأي سبب كان، يتمثل أحد الحلول في إسناد أدوار غير تقليدية للفهارس (باستخدام الفهرس الأول للعمود والفهرس الثاني للصف)، وحلّ آخر هو تجاوز قواعد اللغة بحساب المواضع صراحةً في مصفوفة أحادية البعد. بالطبع، يُحتمل أن يُكبّد الخروج عن المألوف تكلفةً تزداد مع درجة التفاعل الضروري مع خصائص اللغة التقليدية وباقي الشيفرة، ليس فقط في صورة زيادة احتمالية حدوث أخطاء (كأن يُنسى عكس ترتيب ضرب المصفوفات، أو العودة إلى الترتيب التقليدي أثناء صيانة الشيفرة، إلخ)، بل أيضاً في صورة الاضطرار إلى إعادة ترتيب العناصر بشكلٍ فعلي، وكل ذلك يجب موازنته مع أي غرض أصلي كتحسين الأداء. يُفضّل تشغيل الحلقة صفاً صفاً في لغات تعتمد على ترتيب الصفوف مثل لغة C، والعكس صحيح في لغات تعتمد على ترتيب الأعمدة.
لغات البرمجة والمكتبات
عادةً ما تحتوي لغات البرمجة أو مكتباتها القياسية التي تدعم المصفوفات متعددة الأبعاد على ترتيب تخزين أصلي يعتمد على الصفوف أو الأعمدة لهذه المصفوفات.
يُستخدم ترتيب الصفوف الرئيسي في لغات C / C++ / Objective-C (للمصفوفات على نمط C)، و PL/I ، [ 4 ] و Pascal ، [ 5 ] و Speakeasy ، [ 6 ] و SAS . [ 7 ]
يُستخدم ترتيب الأعمدة في لغات البرمجة التالية: Fortran ، [ 8 ] [ 9 ] IDL ، [ 8 ] MATLAB ، [ 9 ] GNU Octave ، Julia ، [ 10 ] S ، S-PLUS ، [ 11 ] R ، [ 12 ] Scilab ، [ 13 ] Yorick ، و Rasdaman . [ 14 ]
لا يعتمد على ترتيب الصفوف ولا على ترتيب الأعمدة
يُعد استخدام متجهات إيليف بديلاً شائعاً لتخزين البيانات في المصفوفات الكثيفة ، حيث تُخزّن هذه المتجهات عادةً مؤشرات إلى عناصر في نفس الصف بشكل متجاور (مثل ترتيب الصفوف)، وليس الصفوف نفسها. وتُستخدم هذه المتجهات في لغات البرمجة التالية (مرتبة حسب تاريخ الاستخدام): جافا [ 15 ] ، سي شارب / سي إل آي / دوت نت ، سكالا [ 16 ] ، وسويفت .
أما استخدام قوائم القوائم فهو أقل كثافة، على سبيل المثال، في بايثون ، [ 17 ] وفي لغة وولفرام الخاصة بـ Wolfram Mathematica . [ 18 ]
يستخدم نهج بديل جداول الجداول، على سبيل المثال، في لغة Lua . [ 19 ]
المكتبات الخارجية
يمكن أيضًا توفير دعم للمصفوفات متعددة الأبعاد بواسطة المكتبات الخارجية، والتي قد تدعم حتى الترتيبات التعسفية، حيث يكون لكل بُعد قيمة خطوة، ويكون الترتيب حسب الصف أو الترتيب حسب العمود مجرد تفسيرين محتملين للنتائج.
الترتيب الرئيسي للصفوف هو الوضع الافتراضي في NumPy [ 20 ] (لغة بايثون).
يُعد ترتيب الأعمدة هو الوضع الافتراضي في Eigen [ 21 ] و Armadillo (كلاهما للغة C++).
يُعدّ OpenGL (و OpenGL ES ) حالةً خاصةً لمعالجة الرسومات. فبما أن "المعالجات الرياضية الحديثة للجبر الخطي والمجالات ذات الصلة تُعامل المتجهات كأعمدة بشكلٍ دائم"، قرر المصمم مارك سيغال استبدال هذا الأسلوب بالأسلوب المُتبع في الإصدار السابق IRIS GL ، والذي كان يُكتب فيه المتجهات كصفوف؛ ولضمان التوافق، ستظل مصفوفات التحويل تُخزّن بترتيب المتجهات (الصفوف) بدلاً من ترتيب الإحداثيات (الأعمدة)، ثم استخدم الحيلة "للقول بأن المصفوفات في OpenGL تُخزّن بترتيب الأعمدة". [ 22 ] كان هذا الأمر ذا صلة بالعرض فقط، لأن ضرب المصفوفات كان يعتمد على المكدس، وكان من الممكن تفسيره على أنه ضرب لاحق. ولكن الأسوأ من ذلك، أن الواقع تسرب عبر واجهة برمجة التطبيقات (API) المبنية على لغة C ، حيث كان يتم الوصول إلى العناصر الفردية كـ ` M[vector][coordinate]x` أو `y` M[column][row]، مما أدى للأسف إلى تشويش الاصطلاح الذي سعى المصمم إلى اعتماده. وقد تم الحفاظ على هذا حتى في لغة تظليل OpenGL التي أُضيفت لاحقًا (على الرغم من أن هذا يتيح أيضًا الوصول إلى الإحداثيات بالاسم، على سبيل المثال، `x` ). ونتيجة لذلك، سيُعلن العديد من المطورين الآن ببساطة أن وجود العمود كأول فهرس هو تعريف الترتيب العمودي، على الرغم من أن هذا ليس هو الحال في لغة حقيقية تعتمد على الترتيب العمودي مثل Fortran.M[vector].y
تم تغيير ترتيب Torch (لـ Lua) من الترتيب العمودي [ 23 ] إلى الترتيب الصفّي [ 24 ] كترتيب افتراضي.
تبديل
بما أن تبديل عناصر المصفوفة هو جوهر عملية تبديل المصفوفات ، فإن المصفوفة المخزنة بترتيب الصفوف ولكن تُقرأ بترتيب الأعمدة (أو العكس) ستظهر مُبدَّلة. ولأن إجراء هذا التبديل في الذاكرة عملية مُكلفة عادةً، توفر بعض الأنظمة خيارات لتحديد تخزين المصفوفات الفردية مُبدَّلة. عندئذٍ، يجب على المبرمج تحديد ما إذا كان سيُعيد ترتيب العناصر في الذاكرة أم لا، بناءً على الاستخدام الفعلي (بما في ذلك عدد مرات إعادة استخدام المصفوفة في عملية حسابية).
على سبيل المثال، يتم تمرير علامات إلى وظائف البرامج الفرعية للجبر الخطي الأساسي تشير إلى المصفوفات التي يتم تبديلها. [ 25 ]
حساب العنوان بشكل عام
يمكن تعميم هذا المفهوم ليشمل المصفوفات ذات الأبعاد التي تزيد عن بعدين.
بالنسبة لـ d- الأبعادمصفوفة ذات أبعاد N k ( حيث k = 1 ... d )، ويتم تحديد عنصر معين من هذه المصفوفة بواسطة مجموعة.من مؤشرات d (التي تبدأ من الصفر).
في ترتيب الصفوف، يكون البعد الأخير متجاورًا، وبالتالي فإن إزاحة الذاكرة لهذا العنصر تُعطى بالصيغة التالية:
في ترتيب الأعمدة، يكون البعد الأول متجاورًا، وبالتالي فإن إزاحة الذاكرة لهذا العنصر تُعطى بالصيغة التالية: حيث يكون الناتج الفارغ هو العنصر المحايد الضربي ، أي.
بالنسبة لترتيب معين، يتم تحديد الخطوة في البعد k بواسطة قيمة الضرب الموجودة بين قوسين قبل الفهرس n k في عمليات الجمع على الجانب الأيمن أعلاه.
بشكل عام، هناك d! ترتيب ممكن لمصفوفة معينة، واحد لكل تبديل للأبعاد (مع ترتيب الصفوف وترتيب الأعمدة حالتين خاصتين فقط)، على الرغم من أن قوائم قيم الخطوة ليست بالضرورة تباديل لبعضها البعض، على سبيل المثال، في مثال 2×3 أعلاه، تكون الخطوات (3،1) لترتيب الصفوف و(1،2) لترتيب الأعمدة.
انظر أيضاً
- المصفوفة (بنية البيانات)
- مقارنة لغات البرمجة (المصفوفة)
- أصل الفهرس ، وهو فرق آخر بين أنواع المصفوفات عبر لغات البرمجة
- تمثيل المصفوفة
- ترتيب مورتون ، طريقة أخرى لربط البيانات متعددة الأبعاد بفهرس أحادي البعد، وهو مفيد في هياكل بيانات الشجرة
- تنسيق CSR ، وهو أسلوب لتخزين المصفوفات المتفرقة في الذاكرة
- التحويل إلى متجه (في الرياضيات) ، وهو ما يعادل تحويل مصفوفة إلى متجه عمودي رئيسي مطابق لها.
مراجع
- ↑ "ذاكرة التخزين المؤقت" . بيتر لارس دوردال . تم الاطلاع عليه بتاريخ 10 أبريل 2021 .
- ↑ "المصفوفات والإدخال/الإخراج المنسق" . دليل لغة فورتران . تم الاطلاع عليه بتاريخ 19 نوفمبر 2016 .
- ↑ "لماذا يجب أن يبدأ الترقيم من الصفر" . أرشيف إي دبليو ديكسترا . تم الاطلاع عليه بتاريخ 2 فبراير 2017 .
- ↑ "مرجع اللغة الإصدار 4 الإصدار 3" (PDF) . IBM . تم الاطلاع عليه في 13 نوفمبر 2017.
يتم تعيين القيم الأولية المحددة لمصفوفة إلى العناصر المتتالية للمصفوفة بترتيب الصفوف (الفهرس الأخير يتغير بسرعة أكبر).
- ↑ "ISO/IEC 7185:1990(E)" (PDF) .
يُعتبر نوع المصفوفة الذي يحدد تسلسلًا من نوعين أو أكثر من أنواع الفهرسة تدوينًا مختصرًا لنوع مصفوفة محدد بحيث يكون نوع الفهرس الخاص به هو نوع الفهرس الأول في التسلسل، وأن يكون له نوع مكون هو نوع مصفوفة يحدد تسلسل أنواع الفهرسة بدون نوع الفهرس الأول في التسلسل ويحدد نفس نوع المكون كما في المواصفات الأصلية.
- ↑ كوهين، س.؛ فينسنت، س.م. (1971-05-01). مقدمة إلى سبيك إيزي (تقرير). مختبر أرغون الوطني، إلينوي (الولايات المتحدة الأمريكية).
- ↑ "مرجع لغة SAS® 9.4: المفاهيم، الطبعة السادسة" (ملف PDF) . معهد SAS، 6 سبتمبر 2017، صفحة 573. تاريخ الاطلاع: 18 نوفمبر 2017.
من اليمين إلى اليسار، يمثل البُعد الأيمن الأعمدة، ويمثل البُعد التالي الصفوف. [...] يضع SAS المتغيرات في مصفوفة متعددة الأبعاد عن طريق ملء جميع الصفوف بالترتيب، بدءًا من الزاوية العلوية اليسرى للمصفوفة (وهو ما يُعرف بترتيب الصفوف).
- 1 2 "الأعمدة والصفوف وأغلبية المصفوفات" . www.nv5geospatialsoftware.com . تم الاطلاع عليه بتاريخ 31 يوليو 2024 .
- 1 2 وثائق MATLAB، تخزين بيانات MATLAB (تم استرجاعها من Mathworks.co.uk، يناير 2014).
- ↑ "المصفوفات متعددة الأبعاد" . جوليا . تم الاطلاع عليه بتاريخ 9 نوفمبر 2020 .
- ↑ شبيغلهالتر وآخرون (2003 ، ص 17) : شبيغلهالتر، ديفيد ؛ توماس، أندرو؛ بيست، نيكي ؛ لون، ديف (يناير 2003)، "تنسيق البيانات: تنسيق S-Plus"، دليل مستخدم WinBUGS (ملف PDF) (الإصدار 1.4 )، كامبريدج، المملكة المتحدة: وحدة الإحصاء الحيوي التابعة لمجلس البحوث الطبية، معهد الصحة العامة، مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 18 مايو 2003.
- ↑ مقدمة إلى R ، القسم 5.1: المصفوفات (تم استرجاعه في مارس 2010).
- ↑ "تحويلات فورييه السريعة مع البيانات متعددة الأبعاد" . ويكي سكيلاب . تم الاطلاع عليه بتاريخ 25 نوفمبر 2017.
نظرًا لأن سكيلاب يخزن المصفوفات بتنسيق الأعمدة، فإن عناصر العمود تكون متجاورة (أي بمسافة فاصلة قدرها 1) في التنسيق الخطي.
- ↑ "تمثيل المصفوفة الداخلية في rasdaman" . rasdaman.org . تم الاطلاع عليه بتاريخ 30 مارس 2025 .
- ↑ "مواصفات لغة جافا" . أوراكل . تم الاطلاع عليه بتاريخ 13 فبراير 2016 .
- ↑ "مصفوفة الكائنات" . مكتبة سكالا القياسية . تم الاطلاع عليه في 1 مايو 2016 .
- ↑ "مكتبة بايثون القياسية: 8. أنواع البيانات" . تم الاطلاع عليه بتاريخ 18 نوفمبر 2017 .
- ↑ "المتجهات والمصفوفات" . وولفرام . تم الاطلاع عليه بتاريخ 12 نوفمبر 2017 .
- ↑ "11.2 – المصفوفات والمصفوفات متعددة الأبعاد" . تم الاطلاع عليه بتاريخ 6 فبراير 2016 .
- ↑ "المصفوفة ذات الأبعاد N (ndarray)" . SciPy.org . تم الاطلاع عليه بتاريخ 3 أبريل 2016 .
- ↑ "Eigen: ترتيب التخزين" . eigen.tuxfamily.org . تم الاطلاع عليه بتاريخ 23-11-2017 .
إذا لم يتم تحديد ترتيب التخزين، فإن Eigen يخزن الإدخال افتراضيًا وفقًا لترتيب الأعمدة.
- ↑ "المتجهات العمودية مقابل متجهات الصفوف" . تم الاطلاع عليه بتاريخ 12 نوفمبر 2017 .
- ↑ "الموتر" . تم الاطلاع عليه بتاريخ 6 فبراير 2016 .
- ↑ "Tensor" . دليل مرجعي لحزمة Torch . تم الاطلاع عليه بتاريخ 8 مايو 2016 .
- ↑ "BLAS (برامج فرعية أساسية في الجبر الخطي)" . تم الاطلاع عليه بتاريخ 16-05-2015 .
مصادر
- دونالد إي. كنوث، فن برمجة الحاسوب المجلد 1: الخوارزميات الأساسية ، الطبعة الثالثة، القسم 2.2.6 (أديسون-ويسلي: نيويورك، 1997).
- المصفوفات
