সীমাবদ্ধ উপাদান ম্যাট্রিক্সের জন্য স্পারসিটি কাঠামোর গণনা


13

প্রশ্ন: সীমাবদ্ধ উপাদান ম্যাট্রিক্সের স্পারসিটি কাঠামোটি নির্ভুল ও দক্ষতার সাথে গণনা করার জন্য কোন পদ্ধতি উপলব্ধ?

তথ্য: আমি গেইরকিনের পদ্ধতিটি চতুর্ভুজ লাগরাঞ্জ ভিত্তিতে ব্যবহার করেছি, সি-তে লিখিত, এবং স্প্রেস ম্যাট্রিক্স স্টোরেজ এবং কেএসপি রুটিনের জন্য পিইটিএসসি ব্যবহার করছি Po পিইটিএসসি দক্ষতার সাথে ব্যবহার করতে, বিশ্বব্যাপী স্টিফনেস ম্যাট্রিক্সের জন্য আমার পূর্বের বরাদ্দ থাকা দরকার to

বর্তমানে, আমি নিম্নে সারি প্রতি ননেরেরোগুলির সংখ্যা অনুমান করার জন্য একটি মক সমাবেশ করছি (সিউডোকোড)

int nnz[global_dim]
for E=1 to NUM_ELTS
  for i=1 to 6
    gi = global index of i 
    if node gi is free
      for j=1 to 6
        gj = global index of j
        if node gj is free 
          nnz[i]++

এটি অবশ্য এনএনজিকে বেশি গুরুত্ব দেয় কারণ কিছু নোড-নোড ইন্টারঅ্যাকশন একাধিক উপাদানগুলিতে ঘটতে পারে।

আমি যে জে, ইন্টারঅ্যাকশনগুলি পেয়েছি তার ট্র্যাক রাখার চেষ্টা করার বিষয়টি বিবেচনা করেছি, তবে আমি অনেক স্মৃতি ব্যবহার না করে কীভাবে এটি করব তা সম্পর্কে আমি নিশ্চিত নই। আমি নোডগুলিও লুপ করতে পারি এবং সেই নোডকে কেন্দ্র করে ভিত্তি ফাংশনটির সমর্থন খুঁজে পেতে পারি, তবে তারপরে আমাকে প্রতিটি নোডের জন্য সমস্ত উপাদান অনুসন্ধান করতে হয়েছিল, যা অদৃশ্য বলে মনে হয়।

আমি এই সাম্প্রতিক প্রশ্নটি পেয়েছি , যার মধ্যে কিছু দরকারী তথ্য রয়েছে, বিশেষত স্টেফানো এম, যারা লিখেছিলেন from

আমার পরামর্শটি হ'ল অজগর বা সিতে এটি প্রয়োগ করা, কিছু গ্রাফ তাত্ত্বিক ধারণা প্রয়োগ করা, অর্থাৎ ম্যাট্রিক্সের উপাদানগুলিকে গ্রাফের প্রান্ত হিসাবে বিবেচনা করুন এবং সংলগ্ন ম্যাট্রিক্সের স্পর্শ কাঠামোটি গণনা করুন। তালিকাগুলির তালিকা বা কীগুলির অভিধান অভিধান সাধারণ পছন্দ।

আমি এ সম্পর্কে আরও বিশদ এবং সংস্থান খুঁজছি। আমি স্বীকার করেছি যে খুব বেশি গ্রাফ তত্ত্বটি আমি জানি না এবং আমি কার্যকর হতে পারে এমন সমস্ত সিএস ট্রিকগুলির সাথে পরিচিত নই (আমি এটি গাণিতিক দিক থেকে কাছে আসছি)।

ধন্যবাদ!

উত্তর:


5

আপনি যে আই, জে মিথস্ক্রিয়া পেয়েছেন তার উপর নজর রাখার ধারণাটি আপনার পক্ষে কাজ করতে পারে, আমি মনে করি এটি "সিএস ট্রিক" যা আপনি এবং স্টেফানো এম উল্লেখ করেছেন। এটি তালিকা ফর্ম্যাটের তালিকায় আপনার স্পারস ম্যাট্রিক্স তৈরির পরিমাণ ।

আপনার কাছে কতটা সিএস রয়েছে তা নিশ্চিত নন তবে এটি ইতিমধ্যে আপনার জানা থাকলে আমি ক্ষমাপ্রার্থী: একটি লিঙ্কযুক্ত তালিকার ডেটা কাঠামোতে প্রতিটি এন্ট্রি তার পরে প্রবেশের আগে এবং প্রবেশের জন্য একটি পয়েন্টার সঞ্চয় করে। এগুলি থেকে এন্ট্রি যুক্ত এবং মুছে ফেলা সস্তা, তবে এটিতে আইটেমগুলি সন্ধান করা তত সহজ নয় - আপনাকে এগুলির সমস্তটি সন্ধান করতে হতে পারে।

সুতরাং, প্রতিটি নোডের জন্য, আপনি একটি লিঙ্কযুক্ত তালিকা সঞ্চয় করবেন। তারপরে আপনি সমস্ত উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করুন; যদি আপনি দুটি নোড পেয়ে থাকেন যে আমি এবং জে সংযুক্ত রয়েছে তবে আপনি i এর লিঙ্কযুক্ত তালিকার দিকে যান। যদি জে ইতিমধ্যে সেখানে না থাকে, আপনি এটি তালিকায় যুক্ত করুন, এবং একইভাবে আমি জেয়ের তালিকায় যুক্ত করব। আপনি যদি তাদের ক্রম যুক্ত করেন তবে এটি সবচেয়ে সহজ।

একবার আপনি আপনার তালিকার তালিকাটি জনপ্রিয় করে তোলেন, এখন আপনি ম্যাট্রিক্সের প্রতিটি সারিতে অ-শূন্য নথির সংখ্যা জানেন: এটি নোডের তালিকার দৈর্ঘ্য। এই তথ্যটি হ'ল পিইটিএসসি'র ম্যাট্রিক্স ডেটা স্ট্রাকচারে একটি স্পারস ম্যাট্রিক্স প্রিলোকল্ট করার জন্য আপনার ঠিক কী প্রয়োজন। তারপরে আপনি আপনার তালিকার তালিকাটি মুক্ত করতে পারেন কারণ আপনার আর এটির প্রয়োজন নেই।

যাইহোক, এই পদ্ধতির ধারণা করা হয় যে আপনার সমস্ত কিছুই হ'ল প্রতিটি উপাদানের মধ্যে কোন নোড রয়েছে তার তালিকা।

কিছু জাল জেনারেশন প্যাকেজ - উদাহরণস্বরূপ ত্রিভুজ - কেবলমাত্র উপাদানগুলির তালিকা এবং কোন নোডগুলিতে থাকে তা আউটপুট করতে পারে না, তবে আপনার ত্রিভুজাকৃতির প্রতিটি প্রান্তের একটি তালিকাও তৈরি করতে পারে। সেক্ষেত্রে আপনি শূন্য নয় এমন এন্ট্রিগুলির সংখ্যা বাড়িয়ে তোলার কোনও ঝুঁকি চালান না: টুকরোচক লিনিয়ার উপাদানগুলির জন্য প্রতিটি প্রান্ত আপনাকে ঠিক 2 কড়া ম্যাট্রিক্স এন্ট্রি দেয়। আপনি টুকরোখের চতুর্ভুজটি ব্যবহার করছেন, সুতরাং প্রতিটি প্রান্তটি 4 টি প্রবেশের জন্য গণনা করে তবে আপনি ধারণাটি পাবেন get সেক্ষেত্রে আপনি সাধারণ অ্যারে ব্যবহার করে প্রান্ত তালিকার মধ্য দিয়ে একটি পাসের সাথে প্রতি সারিতে নন-শূন্য প্রবেশের সংখ্যা খুঁজে পেতে পারেন।

এই পদ্ধতির সাথে, আপনাকে হার্ড ডিস্ক থেকে একটি অতিরিক্ত বড় ফাইল পড়তে হবে, যা যদি আপনার আসল গণনাটি বড় না হয় তবে উপাদান তালিকাটি ব্যবহার করার চেয়ে ধীর হতে পারে। তবুও, আমি এটি সহজ বলে মনে করি।


ধন্যবাদ। আমার কাছে প্রান্তের তালিকাটি উপলভ্য আছে, সুতরাং আমি সম্ভবত আপনার দ্বিতীয় পদ্ধতিটি আপাতত ব্যবহার করব, তবে আমি ফিরে গিয়ে প্রথম পদ্ধতিটি ব্যবহার করার চেষ্টা করব, কেবল লিঙ্কযুক্ত তালিকাগুলির সাথে আমার হাতগুলি নোংরা করার জন্য (অন্তর্ভুক্তির জন্য ধন্যবাদ ... I ' শুধুমাত্র একটি বেসিক সিএস ক্লাস নিয়েছি, এবং আমি প্রোগ্রামিংয়ের জন্য নক করার সময়, তথ্য স্ট্রাকচার এবং অ্যালগরিদম সম্পর্কে আমার যতটা করা উচিত তা আমি জানি না)
জন এডওয়ার্ডসন

সাহায্য করতে পারলে খুশি! আমি এর থেকে আমার প্রচুর সিএস জ্ঞান তুলেছি: Books.google.com/books?isbn=0262032937 - Godশ্বরের ভালবাসার জন্য, মোড়িত বিশ্লেষণ সম্পর্কে পড়ুন। আপনার নিজস্ব লিঙ্কযুক্ত তালিকা বা সিটিতে বাইনারি অনুসন্ধান ট্রি ডেটা স্ট্রাকচার প্রোগ্রামিং করা সমস্যার জন্য উপযুক্ত।
ড্যানিয়েল শাপেরো

5

আপনি যদি নিজের জালকে কোনও ডিএমপ্লেক্স হিসাবে এবং আপনার ডেটা বিন্যাসটিকে পিটসেসেকশন হিসাবে উল্লেখ করেন তবে ডিএমক্রিয়েটম্যাট্রিক্স () আপনাকে স্বয়ংক্রিয়ভাবে সঠিকভাবে পূর্বনির্ধারিত ম্যাট্রিক্স দেবে। পইসন সমস্যা এবং স্টোকস সমস্যার জন্য এখানে পিইটিএসসি উদাহরণ রয়েছে ।


2

সম্মত

আমি ব্যক্তিগতভাবে এটি করার কোনও সস্তা উপায় সম্পর্কে জানি না তাই আমি কেবল সংখ্যাকেই বেশি মূল্যায়ন করি, সমস্ত সারিগুলির জন্য যুক্তিসঙ্গতভাবে বৃহত্তর মানটি ব্যবহার করি।

উদাহরণস্বরূপ, লিনিয়ার 8 নোড হেক্স উপাদানগুলির তৈরি নিখুঁতভাবে কাঠামোগত জাল জন্য তির্যক এবং বন্ধ তির্যক উভয় ব্লকের সারি প্রতি এনএনজগুলি ডফ * 27 হয়। স্বয়ংক্রিয়ভাবে উত্পন্ন হেক্স মেশিনগুলি সম্পূর্ণরূপে অনিবঠিত সংখ্যার জন্য সংখ্যাটি খুব কমই ডফ * 54 এর বেশি হয়। লিনিয়ার টিটের জন্য আমার কখনই ডোফ * 30 এর বাইরে যাওয়ার প্রয়োজন হয়নি। খুব খারাপভাবে শেপড / লো রিপেক্ট রেশিও উপাদানগুলির সাথে কিছু জালের জন্য আপনাকে কিছুটা বড় মান ব্যবহার করতে হতে পারে।

পেনাল্টিটি হ'ল স্থানীয় (র‌্যাঙ্কে) মেমরির খরচ 2x-5x এর মধ্যে হয় সুতরাং আপনার ক্লাস্টারে স্বাভাবিকের চেয়ে আরও বেশি গণনা নোড ব্যবহার করতে হতে পারে।

বিটিডব্লু আমি সন্ধানযোগ্য তালিকাগুলি ব্যবহার করার চেষ্টা করেছি কিন্তু স্পারসিটি কাঠামো নির্ধারণ করতে সময়টি সমাবেশ / সমাধানের চেয়ে বেশি ছিল। তবে আমার বাস্তবায়ন খুব সহজ ছিল এবং প্রান্তগুলি সম্পর্কিত তথ্য ব্যবহার করেনি।

অন্য বিকল্পটি হ'ল ডিএমএমেশেক্রেটএক্সোডাসের মতো রুটিনগুলি ব্যবহার করা যেমন এই উদাহরণে দেখানো হয়েছে ।


0

আপনি সমস্ত অনন্য (জিআই, জিজে) সংযোগগুলি গণনা করতে দেখছেন, যা তাদের সমস্তকে একটি (নন-ডুপ্লিকেটিং) মিশ্র পাত্রে রাখার পরামর্শ দেয় এবং তারপরে এটির কার্ডিনালিটি গণনা করে - সি ++ এ এটি একটি স্টাডি :: সেট <স্টেডি :: জোড় হবে <int, int>>। আপনার সিউডোকোডে আপনি "এনএনজেড [i] ++" কে "s.insert [পেয়ার (জিআই, জিজে)]" এর সাথে প্রতিস্থাপন করবেন এবং তারপরে ননজারোজের চূড়ান্ত সংখ্যাটি s.size () হবে। এটি ও (এন-লগ-এন) সময়ে চালানো উচিত, যেখানে এনটি ননজারের সংখ্যা।

যেহেতু আপনি সম্ভবত সম্ভাব্য জি-র পরিধিটি ইতিমধ্যে জানেন তাই আপনি পারফরম্যান্সের উন্নতি করতে জিআই সূচক দ্বারা টেবিলটি "স্প্লে" করতে পারেন। এটি আপনার সেটটি একটি স্টাডি :: ভেক্টর <স্টাডি :: সেট <ইন>> এর সাথে প্রতিস্থাপন করে। আপনি এটি "ভি [জিআই]। সন্নিবেশ (জিজে)" দিয়ে গড়ে তোলেন, তারপরে মোট নজারেরো সংখ্যা সমস্ত জি-র জন্য ভি [জিআই]। সাইজ () যোগ করে আসে। এটি ও (এন-লগ-কে) সময়ে চলতে হবে, যেখানে কে উপাদান অনুসারে অজানা সংখ্যার সংখ্যা (আপনার জন্য ছয়টি - মূলত বেশিরভাগ পিডি কোডের জন্য একটি ধ্রুবক, যদি না আপনি এইচপি-পদ্ধতিগুলির কথা বলছেন)।

(দ্রষ্টব্য - এটি নির্বাচিত উত্তরের মন্তব্য হতে চেয়েছিল তবে খুব দীর্ঘ ছিল - দুঃখিত!)


0

স্পার্স ম্যাট্রিক্স আকারের উপাদানগুলির ডফস থেকে শুরু করুন। ম্যাট্রিক্স এর সন্ধানের স্পন্দন রয়েছে। মনে রাখবেন যে বাস্তবায়নে রাখুন সহজ, কেন আমি সংজ্ঞায়িত পরিবর্তে । × টি = { 1 আমি এম এন t আমি 0 গুলি W একজন = ET×

EijT={1if dof jelement i0elsewhere
E T E T EA=EETETETE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.