مقالات

22:11 في الفصل - مسافات متجهة


22:11 في الفصل - مسافات متجهة

01 واجب في فئته: مرحبًا بك في Matrix Algebra مع التطبيقات الحسابية¶

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

✅ الخطوة 1 - أخرج الكمبيوتر المحمول الخاص بك¶

لا تتردد في الحصول على أحد أجهزة الكمبيوتر المحمولة في الفصل الدراسي إذا لم يكن لديك الكمبيوتر المحمول الخاص بك.

✅ الخطوة 2 - إنشاء مجلد مهام الدورة التدريبية في الدليل الرئيسي الخاص بك

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

✅ الخطوة 3 - قم بتنزيل دفتر jupyter هذا¶

قم بتنزيل نسخة من هذا الكمبيوتر الدفتري (ملف ipynb الذي يستخدم لمفكرة ipython).

✅ الخطوة 4 - افتح هذا الواجب في Jupyter¶

افتح الملف الذي تم تنزيله داخل jupyter إما على الكمبيوتر المحمول أو قم بتحميل الملف إلى خادم عبر الإنترنت وافتحه هناك.


22:11 في الفصل - مسافات متجهة

مكتبة قوالب C ++ 17 صغيرة لحسابات المتجهات والمصفوفات.

توفر المكتبة بنية سهلة للتصريح وتعيين المتجهات والمصفوفات وإجراء العمليات الحسابية. تم تصميم فئات المتجه والمصفوفة بحيث يكون لها تخطيط ذاكرة كمصفوفات C ++ للعناصر المعنية ، ويمكن تمريرها إلى مكتبات العرض حيث تكون المؤشرات إلى العوامات مطلوبة (على سبيل المثال). تستخدم المكتبة قوالب تعبير كسول لإجراء العمليات الحسابية.

الإقرار والتنازل

توفر فئة المتجه الوصول إلى جميع العناصر عن طريق الفهارس (عامل منخفض) ووظيفة القالب في & ltN & gt (). يمكن الوصول إلى العناصر الأربعة الأولى للمتجه من خلال الوظائف المسماة x () و y () و z () و w () على التوالي. يتم تحديد هذه الوظائف فقط عندما يسمح حجم المتجه بذلك ، على سبيل المثال بالنسبة لمتجه ثلاثي العناصر ، لن يكون هناك دالة w (). يمكن تكرار عناصر المتجهات باستخدام حلقة نطاق C ++ 11 أو باستخدام التكرارات.

توفر فئة المصفوفة عامل تشغيل منخفض ووظيفة قالب في & ltN & gt () للوصول إلى الصفوف التي يتم تمثيلها بواسطة المتجهات. يتم توفير تكرارات الصفوف بواسطة أزواج الوظائف row_begin () / row_end (). ستوفر أزواج start () / end () مكررات على جميع عناصر المصفوفة ، بالترتيب الذي سيتم فيه وضع مصفوفة ثنائية الأبعاد C ++.

مخازن الذاكرة كنواقل

يمكن الوصول إلى المخزن المؤقت للذاكرة كحاوية للمتجهات بخصائص معينة (الحجم والمكونات). يمكن استخدام المخزن المؤقت الثابت لقراءة البيانات بطريقة منظمة ، ويمكن استخدام المخزن المؤقت غير المكلف لتعديل البيانات في المخزن المؤقت عبر فئتي الأداة المساعدة vector_view و memory_vector_view. طريقة العرض vector_view مخصصة لقراءة عنصر واحد ، أما memory_vector_view فهي مخصصة لاستخدام مخزن مؤقت كـ "حاوية" للمتجهات.

يوفر libbrary الرباعية والعمليات معها ، مثل الجمع والطرح والضرب والقسمة على العددي ، والضرب الرباعي ، والمقدار ، والتسوية ، والوظائف المقترنة والعكسية. يمكن الوصول إلى مكونات رباعي عبر موصّلات w () و x () و y () و z () ، حيث w () هي الجزء الحقيقي و x () و y () و z () معاملات لـ i و j و k على التوالي. أيضًا ، يمكن الوصول إلى الجزء القياسي عبر وظيفة العضو scalar_part () ، ويمكن الوصول إلى الجزء المتجه عبر vector_part ().

مثال على استخدام المربعات الرباعية للتدوير

الإحداثيات القطبية والكروية والأسطوانية

توفر المكتبة إحداثيات قطبية وكروية وأسطوانية وتحويل بينها وبين إحداثيات XYZ.

مكونات الإحداثيات القطبية:

  1. # 0 r () أو rho () ، مكون نصف القطر.
  2. # 1 phi () أو السمت () ، مكون السمت ، القيمة بالراديان بين صفر و 2 ، القيمة طبيعية بشكل تلقائي.

مكونات الإحداثيات الكروية:

  1. # 0 r () أو rho () ، مكون نصف القطر.
  2. # 1 phi () أو الميل () ، الزاوية بين الإسقاط على المستوى والمتجه. نطاق القيمة [-π / 2 ، π / 2] ، القيمة مثبتة تلقائيًا.
  3. # 2 ثيتا () أو السمت () ، مكون السمت ، القيمة بالراديان بين صفر و 2 ، القيمة طبيعية بشكل تلقائي.

مكونات الإحداثيات الأسطوانية:

  1. # 0 r () أو rho () ، مكون نصف القطر.
  2. # 1 phi () أو السمت () ، مكون السمت ، القيمة بالراديان بين صفر و 2 ، القيمة طبيعية بشكل تلقائي.
  3. # 2 ض () أو الارتفاع () ، الارتفاع فوق الصفر.

يتم تحديد التحويل من أجل:

  • XYZ & lt- & gt polar
  • XYZ & lt- & gt كروي
  • XYZ & lt- & gt أسطواني
  • كروي & lt- & GT
  • أسطواني قطبي & lt- & GT
  • كروية & lt- & GT أسطواني

استنادًا إلى فئة المتجهات والتعبيرات ، توفر المكتبة فئات لحسابات الألوان في مساحات ألوان RGB و HSL و HSV. بالنسبة لفئات الألوان ، يتم تحديد العمليات التالية:


مثال على تشغيل كود Python في Jupyter Notebooks¶

واحدة من أكثر الميزات الفريدة والمحددة لدفاتر Jupyter هي القدرة على تشغيل التعليمات البرمجية داخل هذا الكمبيوتر المحمول. هذه القدرة تجعل Jupyter Notebooks مفيدة بشكل خاص في الفصول التي تعلم أو تستخدم مفاهيم البرمجة.

يتم فصل دفاتر Jupyter إلى أنواع مختلفة من "الخلايا". النوعان الرئيسيان من الخلايا هما خلايا Markdown وخلايا الشفرة. تتكون خلايا Markdown (مثل هذه) من نص منسق وصور ومعادلات تشبه إلى حد كبير معالج الكلمات المفضل لديك.

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

لتشغيل الكود ، حدد أولاً خلية الكود بالماوس ثم اضغط باستمرار على مفتاح "Shift" أثناء الضغط على مفتاح "Enter". سيكون عليك الضغط على مفتاح الإدخال مرتين لتشغيل كلتا الخليتين.


إحدى الطرق هي استخدام المصفوفة لتهيئة المتجه

إذا كان برنامج التحويل البرمجي الخاص بك يدعم C ++ 11 ، فيمكنك ببساطة القيام بما يلي:

هذا متوفر في دول مجلس التعاون الخليجي اعتبارًا من الإصدار 4.4. لسوء الحظ ، يبدو أن VC ++ 2010 متأخر في هذا الصدد.

بدلاً من ذلك ، تستخدم مكتبة Boost.Assign سحرًا غير ماكرو للسماح بما يلي:

لكن ضع في اعتبارك أن هذا يحتوي على بعض النفقات العامة (بشكل أساسي ، ينشئ list_of std :: deque تحت الغطاء) لذلك بالنسبة إلى رمز الأداء الحرج ، من الأفضل أن تفعله كما يقول Yacoby.

إذا استطعت ، استخدم C ++ الحديثة [11،14،17،20. ] طريق:

الطريقة القديمة للتكرار على مصفوفة متغيرة الطول أو استخدام sizeof () مريعة حقًا للعيون وغير ضرورية تمامًا من حيث الحمل الذهني. يوك.

في C ++ 0x ، ستتمكن من القيام بذلك بنفس الطريقة التي استخدمتها مع مصفوفة ، ولكن ليس بالمعيار الحالي.

مع دعم اللغة فقط ، يمكنك استخدام:

إذا كان بإمكانك إضافة مكتبات أخرى ، يمكنك تجربة boost :: assignment:

لتجنب حجم المصفوفة بالترميز الثابت:

STL التقليدية مع وحدات ماكرو عامة:

STL التقليدية مع ماكرو تهيئة متجه:

فقط ظننت أنني سألقي في .02. أنا أميل إلى التصريح بهذا:

في رأس الأداة في مكان ما ثم كل ما هو مطلوب هو:

لكن لا يمكنني الانتظار حتى C ++ 0x. أنا عالق لأن التعليمات البرمجية الخاصة بي يجب أيضًا تجميعها في Visual Studio. بوو.

C ++ 11 وما بعده ممكن أيضًا

C ++ 17 فصاعدًا يمكننا حذف النوع

إذا لم يكن لديك مترجم C ++ 11 ولا تريد استخدام التعزيز:

إذا لم يكن لديك مترجم C ++ 11 ويمكنك استخدام التعزيز:

إذا كان لديك مترجم C ++ 11:

لتهيئة المتجه -

يمكن القيام به إذا كان لديك مترجم C ++ 11.

عدا ذلك ، يمكنك الحصول على مصفوفة من البيانات ثم استخدام حلقة for.

بصرف النظر عن هذه ، هناك العديد من الطرق الأخرى الموضحة أعلاه باستخدام بعض التعليمات البرمجية. في رأيي ، هذه الطرق سهلة التذكر وسريعة الكتابة.

أسهل طريقة للقيام بذلك هي:

أقوم ببناء الحل الخاص بي باستخدام va_arg. هذا الحل متوافق مع C ++ 98.

إذا كان برنامج التحويل البرمجي الخاص بك يدعم وحدات الماكرو المتغيرة (وهو ما ينطبق على معظم برامج التحويل البرمجي الحديثة) ، فيمكنك استخدام الماكرو التالي لتحويل تهيئة المتجه إلى سطر واحد:

باستخدام هذا الماكرو ، يمكنك تحديد متجه مُهيأ برمز مثل هذا:

سيؤدي هذا إلى إنشاء متجه جديد من ints يسمى my_vector مع العناصر 1 ، 2 ، 3 ، 4.

إذا كنت لا ترغب في استخدام التعزيز ، ولكنك ترغب في الاستمتاع ببناء الجملة مثل

فقط قم بتضمين هذا الجزء من التعليمات البرمجية

يمكنك القيام بذلك باستخدام boost :: assign.

سؤال مكرر حديث لديه هذه الإجابة بواسطة فيكتور سهر. بالنسبة لي ، فهو مضغوط وجذاب بصريًا (يبدو أنك "تدفع" القيم في) ، ولا يتطلب C ++ 11 أو وحدة طرف ثالث ، ويتجنب استخدام متغير إضافي (مكتوب). فيما يلي كيف أستخدمه مع بعض التغييرات. يمكنني التبديل إلى توسيع وظيفة المتجه و / أو va_arg في المستقبل.

يمكن استخدام الطرق أدناه لتهيئة المتجه في c ++.

int arr [] = <1، 3، 5، 6> vector & ltint & gt v (arr، arr + sizeof (arr) / sizeof (arr [0]))

vector & ltint & gtv v.push_back (1) v.push_back (2) v.push_back (3) وهكذا

الثالث مسموح به فقط في C ++ 11 وما بعده.

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

إليك طريقة أستخدمها لهذا والتي ستعمل عالميًا عبر المجمعين والمنصات:

قم بإنشاء هيكل أو فئة كحاوية لمجموعتك من الكائنات. تحديد وظيفة الحمل الزائد للمشغل لـ & lt & lt.

يمكنك إنشاء وظائف تأخذ البنية الخاصة بك كمعامل ، على سبيل المثال:

بعد ذلك ، يمكنك استدعاء هذه الوظيفة ، على النحو التالي:

بهذه الطريقة ، يمكنك بناء مجموعة من الكائنات ذات الحجم الديناميكي وتمريرها إلى وظيفة في سطر واحد نظيف!


الأمراض المنقولة جنسيا :: ناقلات :: تعيين

يقوم بتعيين محتويات جديدة للمتجه ، واستبدال محتوياته الحالية ، وتعديل حجمه وفقًا لذلك.

في ال إصدار النطاق (1) ، المحتويات الجديدة عبارة عن عناصر تم إنشاؤها من كل عنصر من العناصر الموجودة في النطاق بينهما أول و الاخير، في نفس الترتيب.

في ال نسخة كاملة (2) المحتويات الجديدة ن عناصر ، كل منها مهيأ لنسخة من فال.

في حالة حدوث إعادة تخصيص ، يتم تخصيص التخزين المطلوب باستخدام المخصص الداخلي.

في ال إصدار النطاق (1) ، المحتويات الجديدة عبارة عن عناصر تم إنشاؤها من كل عنصر من العناصر الموجودة في النطاق بينهما أول و الاخير، في نفس الترتيب.

في ال نسخة كاملة (2) المحتويات الجديدة ن عناصر ، كل منها مهيأ لنسخة من فال.

في ال إصدار قائمة المُهيئ (3) ، المحتويات الجديدة عبارة عن نسخ من القيم التي تم تمريرها كقائمة مُهيئ ، بنفس الترتيب.

يتم استخدام المخصص الداخلي (من خلال سماته) لتخصيص وإلغاء تخصيص التخزين في حالة حدوث إعادة تخصيص. يتم استخدامه أيضًا لتدمير جميع العناصر الموجودة ، وبناء العناصر الجديدة.

أي عناصر محتجزة في الحاوية قبل المكالمة دمرت واستبدالها بعناصر تم إنشاؤها حديثًا (لا يتم تعيين عناصر للعناصر).

يؤدي هذا إلى إعادة تخصيص مساحة التخزين المخصصة تلقائيًا إذا - وفقط إذا - يتجاوز حجم المتجه الجديد سعة المتجه الحالية.


push_back () و insert () كل من زيادة الاستدعاء () ، والتي تفشل في زيادة السعة لأن GROWER عبارة عن عدد صحيح ، لذلك يتم اقتطاع 1.6 إلى 1 ، ولا يغير مضاعفة السعة * 1 من قيمتها. ولكن حتى إذا تم زيادة السعة بشكل صحيح ، فلن يتم إعادة تخصيص مجموعة data_ptr على الإطلاق لتلائم السعة الجديدة.

ولكن حتى لو كانت الدالة Grow () تعمل بشكل صحيح ، فلا داعي لاستدعاء Grow () عند كل إدخال لعنصر جديد ، مما يلغي الغرض من فصل n_elems عن السعة في البداية. يجب زيادة المصفوفة فقط عندما يصل n_elems إلى السعة.

هناك العديد من المشكلات الأخرى في فصلك أيضًا:

عامل التشغيل = لا يختبر التخصيص الذاتي ، ويسرب الذاكرة المخصصة للمصفوفة القديمة. ضع في اعتبارك استخدام مصطلح تبادل النسخ بدلاً من ذلك.

الجبهة () لا تصل إلى تعليمة الرمي عندما تكون المصفوفة فارغة.

يقوم at () و erase () بفحص الحدود باستخدام السعة بدلاً من n_elems.

push_back () يقوم بإدخال القيمة الجديدة في الفهرس الخطأ ، ولا يقوم بزيادة n_elems.

pop_back () لا تظهر خطأ عندما تكون المصفوفة فارغة ، مما يتسبب في إنقاص n_elems إلى أقل من 0 ، والذي يلتف حول القيمة الإيجابية القصوى لـ size_t لأن size_t هو غير موقعة.

امسح () والعامل == الخروج من الحدود أثناء تكرار المصفوفة.

يجب ألا يُرجع البدء () والنهاية () القيمة nullptr لمصفوفة فارغة. وتعود الدالة end () بمؤشر إلى العنصر الأخير في مصفوفة غير فارغة بدلاً من إرجاع المؤشر إلى 1 بعد العنصر الأخير.

عامل التشغيل == والعامل! = لا تقم بإجراء أي فحص للحدود للتأكد من أن المتجهين لهما نفس n_elems قبل تكرار المصفوفات. وهم يقارنون قيم العناصر التي تتجاوز n_elems. أيضا ، عامل التشغيل! = يقوم بإرجاع النتيجة الخاطئة.

مع ذلك ، جرب شيئًا مثل هذا:

لقد افتقدت إعلان المتجه هنا ، لكن يمكنني أن أتخيل هيكلها. أول خطأ تفعله هنا:

إعادة التخصيص لا يحدث ، أين هو؟ أنت فقط تستدعي حمية من السلوك غير المحدد.

عليك إما جعل GROWER عائمًا أو زيادة الحجم بالحجم الثابت. كما أنه من غير المعتاد أن ينمو المتجه هندسيًا. وغير فعّال جدًا في النمو في كل مرة يتم فيها إعادة الدفع. بدلاً من ذلك ، يجب أن يكون لديك سعة وحجم مخصص. قد يكون الجزء الأخير أكبر وقد ينمو إذا أدى رد الدفع إلى زيادة السعة خارج حدوده. يبدو أن لديك عددًا من العناصر n_elems هناك ، لكنك تتجاهلها؟

كثير من هؤلاء يقومون بالكثير من العمل الإضافي ولا يفعلون ما ينبغي عليهم القيام به. يمكن أن يكون مثل هذا في الواقع

استخدم قوائم التهيئة ، وليس الآثار الجانبية. أو قد تفقدهم. لا يأخذ مُنشئ النسخ أيضًا في الاعتبار n_elems لـ v وقد ينسخ القمامة ويحولها إلى عناصر جديدة.


أهلا بالجميع. أنا حقا بحاجة إلى بعض المساعدة. لقد قمت بهذه المهمة ، ولكن تم إرسالها إلى البكالوريا

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

إسناد قيمة:
تمتلك مساحات المتجهات مجموعة من الخصائص والخصائص المحددة.

مجموعة العناصر التي تنتمي إلى ص 2 عادة ما يشار إليه على أنه <(أ, ب) | أ, بص >. يجب أن يستخدم الجمع بين العناصر ضمن هذه المجموعة ضمن عمليات الجمع والضرب القياسي الترميز التالي:

حدد فضاء فرعي غير بديهي لـ ص 2 ، عرض جميع الأعمال.

إليكم ما فعلته: لكي أتمكن من تحديد فضاء فرعي غير بديهي ، يجب أن أفهم أولاً
ما هو غير بديهي في الواقع. Nontrivial هي معادلة خطية تكون فيها القيمة على الأقل
متغير واحد من المعادلة لا يساوي 0. لذلك ، لوصف فضاء فرعي غير بديهي ، سأحتاج إلى معادلة خطية لا يساوي فيها أحد المتغيرات 0. لذلك ، دع v = (5 ، 4) و u = (0 ، 0) في R ^ 2. . لكي أتمكن من إظهار أن هذا هو فضاء فرعي لـ R ^ 2 ، أحتاج إلى إظهار ثلاثة أشياء. أولاً ، أحتاج إلى إظهار أن 0 موجود في R ^ 2). ثانيًا ، سأحتاج إلى إظهار الإغلاق للإضافة. أخيرًا ، أحتاج إلى إظهار إغلاق الضرب القياسي. الآن ، لإظهار أن 0 موجود في R ^ 2 ، أحتاج أولاً إلى الخروج بمعادلة خطية تمر عبر الأصل والنقطة (5 ، 4). لذلك ، فإن معادلي الخطية هي y = 5 / 4x. هذه هي المعادلة الخطية التي ترضي كلا النقطتين وتمر من خلال الأصل لأنني سأقوم بتوصيل النقاط ومعرفة ما إذا كنت سأحصل على المساواة. لذلك ، 5 = 5/4 (4) = 5 و 0 = 5/4 (0) = 0. لذلك ، v و u موجودان في R ^ 2. هذا يدل على أن 0 موجود في R ^ 2. الآن ، أحتاج إلى إظهار أن (u + v) في R ^ 2. سأوضح الآن أنه مغلق تحت الإضافة: u + v = (4، 5) + (0، 0) = (4 + 0، 5 + 0) = (4، 5) الموجود في R ^ 2 كما هو موضح في الاعلى. لذلك ، يتم إغلاقه تحت الإضافة. الآن ، علينا أن نبين أن المجموعة مغلقة في ظل الضرب القياسي. سأدع العدد القياسي الخاص بي = 5 ، ثم 5u = 5 (4 ، 5) = (20 ، 25) وهو في R ^ 2 لأن 25 = 5/4 (20) = 25. نظرًا لأنني ، من الأعلى ، أوضحت أن 0 موجود في R ^ 2 ، و u + v في R ^ 2 ، و c (u) في R ^ 2 ، سيكون هذا فضاءًا فرعيًا غير بديهي لـ R ^ 2.

التعليقات التي حصلت عليها عندما أُعيدت إليّ هي: تم تقديم الكثير من المناقشات حول هذا الجزء من المهمة. ومع ذلك ، ليس من الواضح ما هو الفضاء الجزئي غير التافه حيث تم توفير متجهين. متجهان لا يشكلان فضاء فرعي.

هل يمكن لأي شخص أن يخبرني ما يعنيه المصنف بهذا التعليق ، وهل يمكن لأي شخص أن يخبرني كيف يمكنني إصلاحه. شكرا لك. سأكون في دينك إلى الأبد.

Daon2

كبار الأعضاء

الفضاء الجزئي لـ R ^ 2 الذي يحتوي على متجه غير صفري سيحتوي على متجهات عديدة بشكل لا نهائي ، مع وجود متجهين هو. ليس كافي. على سبيل المثال ، إذا كانت (5،4) تنتمي إلى فضاءك الفرعي ، فيجب أن تكون (10،8) ، (-5 ، -4) ، وما إلى ذلك. ، ولكن هذا يعني عادةً أنه ليس <(0،0)> ليس R ^ 2.

R ^ 2 هو فضاء متجه ثنائي الأبعاد. أي فضاء فرعي مناسب سيكون أحادي البعد. لديك حل في منتصف فقرتك. جميع النقاط (س ، ص) مرضية ص = 5 / 4x.


استرجاع المعلومات

في الواجب المنزلي 3 ، ستنفذ استرجاعًا مُرتّبًا موصوفًا في المحاضرتين 7 و 8.

القواسم المشتركة مع الواجب المنزلي # 2

ستستخدم أوامر الفهرسة والاستعلام تنسيق إدخال مماثل لـ Homework 2 ، بحيث لا تحتاج إلى تعديل أي من التعليمات البرمجية للتعامل مع معالجة سطر الأوامر. إلى خلاصة:

الفهرسة: $ python index.py -i-directory-of-documents -d Dictionary-file -p postings-file

يبحث: $ python search.py ​​-d Dictionary-file -p-postings-file -q file-of-queries -o output-file-of-results

سنستخدم أيضًا مجموعة بيانات تدريب رويترز المقدمة من NLTK مرة أخرى. اعتمادًا على المكان الذي حددت فيه الدليل لبيانات NLTK عند تثبيت بيانات NLTK لأول مرة (تذكر أن التثبيت يتم تشغيله بواسطة nltk.download ()) ، تقع مجموعة البيانات هذه ضمن مسار مثل:. / nltk_data / corpora / رويترز / تدريب /.

كما هو الحال في Homework 2 ، يجب ألا تحتفظ عملية البحث بملف الترحيلات في الذاكرة عند الإجابة على الاستفسارات ، ولكن بدلاً من ذلك ، يجب استخدام مؤشر الملف للوصول العشوائي إلى أجزاء من ملف الترحيلات. ومع ذلك ، لا يوجد مثل هذا التقييد للمفهرس (لا يُطلب منك تنفيذ BSBI أو SPIMI). أيضًا ، يجب عليك الاستمرار في توظيف Porter الناشئ في الإرسال الخاص بك ، سواء لفهرسة المستندات أو معالجة الاستعلام.

نموذج الفضاء المتجه

لتنفيذ VSM ، أنت مايو اختر تنفيذ (يمكنك القيام بذلك بشكل مختلف) قاموسك وقوائم منشوراتك بالتنسيق التالي. والفرق الوحيد بين هذا التنسيق والشكل 1.4 في الكتاب المدرسي هو أنك تقوم بتشفير ترددات المصطلحات في المنشورات بغرض حساب tf & timesidf. تمثل المجموعة في كل عملية نشر (معرف المستند ، التكرار المصطلح).

مصطلح التكرار doc (df)
قوائم التعيينات
متفائل طموح 5 (1, 5)→ (7,2) → (21, 7) → .
. . .

بالإضافة إلى القاموس القياسي وملف الترحيلات ، ستحتاج إلى تخزين المعلومات في وقت الفهرسة حول طول المستند ، من أجل القيام بتسوية المستندات. يشار إلى هذا في ملاحظات المحاضرة والكتب المدرسية بالطول [N]. يمكنك تخزين هذه المعلومات مع المنشورات أو القاموس أو كملف منفصل.

في خطوة البحث ، ستحتاج إلى ترتيب المستندات حسب تشابه جيب التمام بناءً على tf & timesidf. من حيث تدوين SMART لـ ddd.qqq ، ستحتاج إلى تنفيذ مخطط الترتيب lnc.ltc (على سبيل المثال ، log tf و idf مع تطبيع جيب التمام لوثائق الاستعلامات ، وتسجيل tf ، تطبيع جيب التمام ولكن بدون معرف جيب التمام للوثائق. احسب تشابه جيب التمام بين الاستعلام وكل مستند ، مع الأوزان تتبع حساب tf & timesidf ، حيث المصطلح freq = 1 + log (tf) وتردد المستند معكوس idf = log (N / df) (للاستعلامات).

يُقترح استخدام السجل الأساسي 10 لحسابات اللوغاريتمات الخاصة بك (على سبيل المثال ، math.log (x ، 10) ، لكن كن حذرًا من حالات مثل math.log (0 ، 10)). الاستعلامات التي نقدمها هي الآن استعلامات نصية مجانية ، أي أنك لست بحاجة إلى استخدام عوامل تشغيل الاستعلام مثل AND و OR و NOT والأقواس ، ولن تكون هناك استعلامات نصية. تشبه استعلامات النص الحر تلك التي تكتبها في شريط بحث محرك بحث الويب.

يجب أن يُخرج الباحث الخاص بك قائمة بما يصل إلى 10 أكثر صلة (أقل إذا كان هناك أقل من عشرة مستندات متطابقة مع طلب البحث) docIDs ردًا على الاستعلام. يجب ترتيب هذه المستندات حسب الصلة ، مع كون الوثيقة الأولى هي الأكثر صلة بالموضوع. بالنسبة لأولئك الذين تم وضع علامة عليها بنفس الصلة ، قم بفرزها حسب الترتيب المتزايد لمعرفات docID. قم بإخراج هذه المستندات كقائمة محددة المساحة كما في الواجب المنزلي رقم 2. تأكد من عدم تضمين مسافات بيضاء إضافية قبل وبعد أي معرفات للمستندات. على سبيل المثال ، إذا كانت معرفات المستندات 2 و 1024 و 512 عبارة عن 3 مستندات ذات صلة فقط ، فيجب على الباحث أن يخرج معرّفات المستندات هذه سطرًا واحدًا للاستعلام المقابل بهذا الترتيب:

ماذا تسلم؟

أسئلة مقالية

يُطلب منك أيضًا الإجابة على أسئلة المقالة التالية. هذه لاختبار فهمك لمواد المحاضرة. لاحظ أن هذه أسئلة مفتوحة وليس لها إجابات قياسية. عادة ما تكون فقرة أو فقرتان كافيتين لكل سؤال. قد تتلقى مبلغًا صغيرًا من الائتمان الإضافي إذا كان بإمكانك دعم إجاباتك بالنتائج التجريبية.

  1. في هذه المهمة ، لم نطلب منك دعم استعلامات الجمل ، وهي ميزة يتم دعمها عادةً في محركات بحث الويب. صف كيف ستدعم بحث الجمل بالتزامن مع نموذج VSM. رسم تخطيطي للخوارزمية كافٍ. (بالنسبة لأولئك الذين يحبون التحدي ، يرجى المضي قدمًا وتنفيذ هذه الميزة في إرسالك ولكن حددها بوضوح في التعليمات البرمجية الخاصة بك والسماح بتشغيل هذه الميزة أو إيقاف تشغيلها باستخدام مفتاح سطر الأوامر "-x" (حيث "- x "تعني تشغيل المعالجة الموسعة لاستعلامات الجمل الفعلية). سنمنح مكافأة صغيرة لعمليات الإرسال التي تحقق هذه الوظيفة بشكل صحيح).
  2. صف كيف يتفاعل محرك البحث الخاص بك مع المستندات الطويلة والاستعلامات الطويلة مقارنة بالمستندات والاستعلامات القصيرة. هل التطبيع الذي تستخدمه كافٍ لمعالجة المشكلات (انظر القسم 6.4.4 للحصول على تلميح)؟ في حكمك ، هل مخطط ltc.lnc (n.b. ، وليس مخطط الترتيب الذي طُلب منك تنفيذه) كافٍ لاسترداد المستندات من مجموعة Reuters-21578؟
  3. هل تعتقد أن مؤشرات بارامتر المنطقة أو المجال ستكون مفيدة للبحث العملي في مجموعة رويترز؟ ملاحظة: تحتوي مجموعة رويترز على بيانات وصفية لكل مقالة ، لكن جودة البيانات الوصفية ليست موحدة ، ولا يتم تطبيق تصنيفات البيانات الوصفية بشكل موحد (بعض الوثائق بها ، وبعضها لا ينطبق). تلميح: للواجب التالي # 4، نحن إرادة تستخدم البيانات الوصفية الميدانية ، لذلك إذا كنت تريد أن تبني الواجب المنزلي رقم 4 على واجبك المنزلي رقم 3 ، فأنت مرحب بك لبدء دعم هذا مبكرًا (على الرغم من عدم منح رصيد إضافي إذا كان ذلك صحيحًا).

تنسيق التقديم

يُسمح لك بالقيام بهذه المهمة بشكل فردي أو كفريق مكون من شخصين. لن يكون هناك اختلاف في معايير الدرجات إذا قمت بالمهمة كفريق أو بشكل فردي. للحصول على معلومات التقديم أدناه ، ما عليك سوى استبدال أي ذكر لرقم matric برقمي matric متصلين بشرطة فاصلة (على سبيل المثال ، A000000X-A000001Y).

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


3 إجابات 3

كان لديك الكثير من المشاكل مع التعليمات البرمجية الخاصة بك لذلك من الصعب معرفة من أين تبدأ. :)

أنا أتفق مع ما قاله جون برجر.

أخذت الكود الخاص بك إلى جهاز الكمبيوتر الخاص بي لحفظ العبث حول تحميله في كل مرة ، وكذلك حتى أتمكن من استخدام valgrind عليه. من المؤكد أن valgrind أبلغ عن خطأ بعد طباعة المتجه. والسبب في ذلك بسيط. لقد اجتزت ينسخ من الفئة to print_vec مما يعني أنه تم استدعاء المدمر عند الخروج من print_vec ، وبالتالي إلغاء تخصيص الذاكرة. كان يجب أن يكون لديك ملف نسخة منشئ. بدونها يقوم المترجم بعمل نسخة بت من الفئة ، مما يعني أن لديك الآن كائنين يتشاركون نفس الذاكرة المخصصة.

إصلاح سريع وقذر هو استدعاء print_vec بالرجوع إليه:

ومع ذلك ، فإن هذا يترك الخطأ كامنًا في المستقبل.

لقد قمت بتطبيق مُنشئ النسخ في المثال أدناه ، ولكن استدعاء print_vec بالمرجع يحفظ الفئة التي يتعين نسخها ، مما يقلل من عدد عمليات الحذف الجديدة / الجديدة التي تقوم بها ، وبالتالي تقليل تجزئة الذاكرة.

كما قال جون برجر: لا تستدعي المدمر بنفسك! لا يمكنك فعل ذلك. إذا كنت تريد أن تفعل الشيء نفسه في المدمر والوظيفة الواضحة ، فقط اجعل المدمر يستدعي clear ().

يتعارض استخدام الشرطات السفلية المزدوجة الرائدة في المتغيرات مع معيار C ++. لا تفعل ذلك. استخدم شرطة سفلية لاحقة إذا كنت تريد الإشارة إلى متغير عضو. تفقد كل هذه المراجع & GT. هم فقط يفسدون الأشياء.

نظرًا لأنك تخصص مصفوفة ، يجب عليك استخدام حذف [] - لقد فعلت ذلك في مكان واحد دون الآخر.

لماذا فعل هذا؟ إنها مهمة غير ضرورية:

إذا كنت ستقوم بتعيين الفئة لسبب ما ، فيجب عليك أيضًا تنفيذ عامل التشغيل = أو ستواجه نفس المشكلات التي واجهتها مع مُنشئ النسخة. (انظر المثال الخاص بي).

ها أنت تختبر الوظائف (السعة والحجم) دون الاتصال بها:

إذا اتخذت مسار "else" ، فلن تقوم الوظيفة بإرجاع أي قيمة (تحصل على تحذير مترجم إذا قمت بتشغيل التحذيرات).

المثال الذي أعيدت صياغته ، مع اقتراحاتي فيه. يجمع دون تحذيرات أو أخطاء ويعمل دون تعطل (على جهاز كمبيوتر):

في المُنشئ الثاني ، تبدأ بالشفرة التالية:

هذا مميت! لم تقم بتهيئة __data ، لذا يمكنها الاحتفاظ بها أي قيمة تحت الشمس. وهناك مستحيل ما يمكن ربما يكون مؤشرًا صالحًا للبيانات الموجودة - إنه كائن جديد تمامًا غير مهيأ. إن إرجاع مؤشر القمامة هذا إلى الكومة هو ببساطة طلب المتاعب.

قم بإزالة هذه الأسطر - أو الأفضل من ذلك ، استخدام قائمة المُبدِلات كما فعلت مع المُنشئ الأول:

مشكلة أخرى: لقد كتبت في العضو الواضح الخاص بك:

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

بدلاً من ذلك ، انقل الكود الموجود في المدمر إلى clear () ، ثم ببساطة اتصل بـ clear () من المدمر.

واحد آخر ، التقطه @ نيك جامون:

هذا هو اختبار ما إذا كان عضو __data خاطئًا ، وما إذا تم تحديد وظائف السعة والحجم. لا تقلق: الأخيران كانا كذلك. فاتك البادئة __.

[أيضًا ، توقف مع هذا- & GT في كل مكان. لقد استخدمت __ قبل جميع متغيرات الأعضاء (التي هي نفسها ضد الاصطلاح) ، فأنت لست بحاجة إلى التأكيد على حقيقة أنها متغيرات عضو: المترجم يعرف بالفعل.]

هناك شيء أود إضافته.
أشار آخرون بالفعل إلى العديد من الأخطاء في الكود. ويمكنني أن أشير إلى أكثر من ذلك ، لكن ليس هذا هو الهدف.
IMO ، الخطأ الأكبر هو - تنفيذ فئة Vector لـ Arduino!
حتى لو نجحت ، فهي مجرد فكرة سيئة. ضع في اعتبارك أن Arduino يحتوي على قدر محدود جدًا من الذاكرة. يبدو تخصيص الذاكرة الديناميكي في مثل هذه المساحة الضيقة مجرد فكرة سيئة - فأنت تهدر الذاكرة ، وتفتت الكومة ولا تكسب شيئًا تقريبًا ، باستثناء بعض الراحة في الترميز.
لا يزال يتعين علي رؤية حالة يحتاج فيها المرء حقًا إلى تخصيص ذاكرة ديناميكية في مشروع Arduino. وحتى إذا قمت بذلك ، فهناك العديد من الأدوات الأخرى التي يمكنك استخدامها (مثل المخازن المؤقتة المخصصة للمكدس ومخصصات الساحة ومخصصات التجمع وما إلى ذلك). ولكن مرة أخرى ، من المحتمل أن تكون تكلفة الشفرة والذاكرة لهذه الحلول "العامة" غير مجدية على Arduino.
من الجيد في معظم الأوقات استخدام المتجهات والخرائط وأي شيء تريده على منصات مثل الكمبيوتر الشخصي (أعمل مبرمجًا لألعاب الكمبيوتر الشخصي ، لذلك غالبًا ما أواجه مواقف تكون فيها الإضافات مثل هذه كبيرة "لا" ، ولكن بالنسبة لمعظم التطبيقات بخير).
ولكن ، على منصة "ضيقة" مثل Arduino ، أعتقد أنه يجب عليك البقاء "بالقرب من المعدن" وأن تكون متحكمًا بشكل كامل في ما يجري (دورات الذاكرة ووحدة المعالجة المركزية). من الناحية المثالية ، لا يجب عليك سوى تحمل مثل هذه "الكماليات" عندما تعرف ما يجري "تحتها" وأنت تعلم أنه يمكنك التخلص من ذلك. وهو ما نادرًا ما يحدث في المنصات "الضيقة" مثل Arduino.


شاهد الفيديو: شرح درس المتجهات تبسيط مجموع متجهات (شهر اكتوبر 2021).