سؤال

بعد البحث عن الوثائق ، لا يمكنني معرفة هذا الوثائق.

يمكنني كتابة رمز مثل

typedef boost::multi_array<boost::int32_t, 3> data_t;

// 3d --
typedef data_t::array_view<3>::type data_3d_view_t;

// 2d --
typedef data_3d_view_t::reference data_2d_subarray_t;
typedef data_t::array_view<2>::type data_2d_view_t;

ثم يمكنني الوصول إلى شريحة ثنائية الأبعاد باستخدام الأنواع data_2d_subarray_t أو data_2d_view_t.

ما الفرق بينهم ؟
ماذا يمكنني أن أفعل مع واحد لا يمكنني فعله مع الآخر؟
هل هناك أي فرق في الأداء؟

شكرا جزيلا لتوضيح هذا لي. مع أطيب التحيات ، رودريغوب.

هل كانت مفيدة؟

المحلول

من طاولة الأنواع المرتبطة Multiview:

المرجع هذا هو النوع المرجعي للقيمة المحتوية. إذا numdims == 1 ، فهذا عنصر و. خلاف ذلك ، هذا هو نفس النوع مثل القالب الفرعي :: النوع.

قالب array_view :: اكتب هذا هو نوع العرض مع أبعاد dims. يتم إرجاعه عن طريق الاتصال المشغل. النماذج MultiarRay.

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

تتيح لك العرض التعامل مع مجموعة فرعية من العناصر الأساسية في MultiarTy كما لو كانت عبارة عن Multiarayray منفصلة. نظرًا لأن الرأي يشير إلى نفس العناصر الأساسية ، فإن التغييرات التي تم إجراؤها على عناصر العرض ستنعكس في MultiarRay الأصلي.

يتم تعريف الرمادي المتعدد بشكل متكرر. متعددة الأبعاد ن > 1 يمكن اعتبارها مجموعة من الرمادي المتعدد من البعد ن-1 ، وهي بطولات فرعية. الفرق الرئيسي بين المستعر الفرعي والرؤية هو أنه يمكنك تقطيع multiaray إلى وجهات نظر ذات أبعاد أقل على طول أي محور ، بما في ذلك المحور الرئيسي ، ولكن لا يمكن تقطيع المطلبات الفرعية على طول المحور الرئيسي.

data_t d3(boost::extents[4][5][6]);
data_2d_view_t d2_view = d3[boost::indices[range(0,4,2)][1][range(0,6,3)]];
data_2d_subarray_t d2_sub = d3[1];
// the following, and anything like it, won't work 
data_2d_subarray_t d2_sub_b = d3[range(0,4,2)][0];

لا أعتقد أن هناك أي فرق كبير في الأداء ، على الرغم من أن هذا يعتمد على نوع الفهرس الذي تستخدمه عند إنشاء طريقة عرض. قد تكون وجهات النظر أقل أداءً بقليل ، ولكن ليس بمعنى كبير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top