ব্যবহার করে জন্য সমাধান করুন


12

আমি থেকে সি ++ তে একটি বিদ্যমান কোড পোর্ট করছি এবং সমাধান করার জন্য একটি রৈখিক ব্যবস্থা আছে (আরও সাধারণ ফর্ম চেয়ে বেশি )xA=bAx=b

ম্যাট্রিক্স ঘন, এবং সাধারণ ফর্ম, কিন্তু কোন 1000x1000 চেয়ে বড়। সুতরাং ম্যাটল্যাবে, সমাধানটি ফাংশন বা ফরোয়ার্ড-স্ল্যাশ স্বরলিপি দ্বারা পাওয়া যায়Amrdivide(b,A)x = b/A;

BLAS এবং LAPACK রুটিন ব্যবহার করে আমার সি ++ কোডে কীভাবে এটি সমাধান করব?

আমি ল্যাপাক রুটিনের সাথে পরিচিত DGESVযা জন্য সমাধান করে ।Ax=bx

সুতরাং, আমার মনে হয়েছিল ম্যাট্রিক্স ট্রান্সপোজ পরিচয় ব্যবহার করে কিছু হেরফের করতে হবে:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

তারপরে DGESVট্রান্সপোজড অপারেটিং ব্যবহার করে চূড়ান্ত ফর্মটি সমাধান করুন । (তাই জায়গা বদল করুন খরচ এবং সিস্টেম সমাধানের জন্য খরচ)ATA

আরও কার্যকর বা অন্যথায় ভাল একটি পদ্ধতির আছে ?

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

এছাড়াও, আমার খেয়াল করা উচিত আমি কোড সেটআপের সময় এই ধরণের অপারেশনটি কয়েকবারই সম্পাদন করছি, সুতরাং কার্য সম্পাদন একটি গুরুতর উদ্বেগ নয়।

হয়তো এই ম্যাটল্যাব ডকুমেন্টেশন উপর mrdivideঅন্যদের জন্য সহায়ক।

উত্তর:


10

জন্য তুচ্ছ উত্তর বর্গ : ব্যবহার যা সমাধান এছাড়াও যখন ।AdgesvxATx=bTRANS = 'T'

দয়া করে নোট করুন যে BLAS বা LAPACK এর সাহায্যে আপনাকে ম্যাট্রিক্সের (মেমরির উপাদানগুলিকে অদলবদল করার জন্য) খুব কষ্ট সহ্য করতে হবে: TRANSট্রান্সপোজ ম্যাট্রিক্সে বা কোনও ভিন্ন মেমরির বিন্যাসে সঞ্চিত ম্যাট্রিক্সে অপারেশন করার জন্য বেশিরভাগ সাব্রোটিনের যুক্তি রয়েছে। (ট্রান্সপজিশনটি ফরট্রান-সামঞ্জস্যপূর্ণ মেমরি লেআউটটিকে সি-কনজিস্টুয়াস এক এবং বিপরীতে রূপান্তর করার সমতুল্য))


উত্তর এবং ব্যাখ্যা জন্য ধন্যবাদ! আমি ল্যাপাক দিয়ে খুব কম কাজ করেছি এবং এখন আমি ট্রান্স বিকল্পের সন্ধান করতে জানি। ট্রান্স আর্গুমেন্টটি কাজ করার boost::numeric::bindings::lapack::gesvx()জন্য আমার সমস্যা হচ্ছে, তবে এটি এখানে আমার প্রশ্নের অংশ নয়। আমার যদি সাফল্য থাকে তবে আমি কীভাবে এটি করব তার একটি নোট নিয়ে ফিরে আসব।
নূহআর

gesvx()পথে কোনও হোঁচট ছাড়াই না হলেও আমার একটি কাজের সমাধান রয়েছে । যখন ট্রান্স যুক্তি 'টি' হয়, LAPACK ডকুমেন্টেশন বলেছেন gesvxসমাধান , কিন্তু সত্যিই এটা solves কারণ ইনপুট আর্গুমেন্ট ফর্ম এবং তাদের অ হতে বলে আশা করা হয় ট্রান্সপোজড ফর্ম। সুতরাং, আর্গুমেন্ট স্থানান্তরিত হয়, যখন এবং হয় না। দুর্দান্ত, এটি আরও সুবিধাজনক। যদি অন্য কেউ যদি এই সংখ্যাটি বৃদ্ধির জন্য বুস্ট ব্যবহার করার চেষ্টা করে তবে হোঁচট খায় তবে আমি বলব যে আমি এই দ্রাব্যে ট্রান্সপোজ ইন্টারফেসটি ব্যবহার করতে সক্ষম হইনি। বাইন্ডিংয়ের মাধ্যমে কাজ করা। টি এক্স টি = বি টি এক্স বি এক্স বিATX=BATXT=BTXBAXB
নূহআর

ঠিক আছে, আমি gesvxট্রান্সপোজ ফর্মটি ব্যবহার করার কৌশলটি পেয়েছি boost::numeric::bindings। পক্ষান্তরিত ম্যাট্রিক্স মোড়ানো মধ্যে ফাংশন। এটি প্যারামিটারটিকে ট্রান্সপোজ টাইপের হিসাবে চিহ্নিত করে : ATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
নূহআর

0

আপনি এসভিডির কিউআর পঁচনটি ব্যবহার করে এর সিউডো উল্টো গণনা করতে পারেন , যা উভয়ই ল্যাপাকের অন্তর্ভুক্ত।A

xA=bxQR=bx=bR1QT

এটি যে কোনও আয়তক্ষেত্রাকার জন্য কাজ করবে ।A


3
যদি আয়তক্ষেত্রাকার হয় (বর্গক্ষেত্র নয়), তবে এবং expression এক্সপ্রেশনটি অপরিজ্ঞাত হয়। আর আর - 1ARR1
জেফ অক্সবেরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.