আমি যদি আমার প্রোগ্রামে একটি জনবহুল ম্যাট্রিক্সের দিকে লক্ষ্য করি তবে আমি অনুবাদ উপাদানগুলি 4 র্থ, অষ্টম এবং 12 তম উপাদানগুলিকে দখল করতে দেখছি।
আমি শুরু করার আগে, এটা বুঝতে গুরুত্বপূর্ণ: এই মানে হল আপনার ম্যাট্রিক্স হয় প্রধান সারি । অতএব, আপনি এই প্রশ্নের উত্তর দিন:
আমার কলাম মেজর ডাব্লুভিপি ম্যাট্রিক্সটি এইচএলএসএল কলটির সাহায্যে শিখুনকে রূপান্তর করতে সফলভাবে ব্যবহৃত হয়: মুল (ভেক্টর, ম্যাট্রিক্স) যা ভেক্টরকে সারি-প্রধান হিসাবে বিবেচনা করা উচিত, সুতরাং আমার গণিতের লাইব্রেরি দ্বারা সরবরাহ করা কলামের বড় ম্যাট্রিক্স কীভাবে কাজ করতে পারে?
বেশ সহজ: আপনার ম্যাট্রিকগুলি সারি-প্রধান।
এত লোক সারি-মেজর বা ট্রান্সপোজড ম্যাট্রিকগুলি ব্যবহার করে যে তারা ভুলে যায় যে ম্যাট্রিকগুলি সেভাবেই প্রাকৃতিকভাবে নয়। সুতরাং তারা একটি অনুবাদ ম্যাট্রিক্স এটি হিসাবে দেখুন:
1 0 0 0
0 1 0 0
0 0 1 0
x y z 1
এটি একটি স্থানান্তরিত অনুবাদ ম্যাট্রিক্স । এটি একটি সাধারণ অনুবাদ ম্যাট্রিক্সের মতো দেখায় না। অনুবাদটি চতুর্থ সারিতে নয়, চতুর্থ কলামে যায় । কখনও কখনও, আপনি এমনকি পাঠ্যপুস্তকে এটি দেখতে পান যা সম্পূর্ণ আবর্জনা।
অ্যারেতে ম্যাট্রিক্স সারি বা কলাম-মেজর কিনা তা জানা সহজ। যদি এটি সারি-প্রধান হয়, তবে অনুবাদটি 3, 7 এবং 11 তম সূচকগুলিতে সংরক্ষণ করা হবে। যদি এটি কলাম-মেজর হয় তবে অনুবাদটি 12, 13 এবং 14 তম সূচকগুলিতে সংরক্ষণ করা হবে। অবশ্যই জিরো-বেস সূচকগুলি।
আপনার বিভ্রান্তি এই বিশ্বাস থেকে শুরু হয়েছে যে আপনি যখন সারি-প্রধানগুলি ব্যবহার করছেন তখন আপনি কলাম-মেজর ম্যাট্রিক ব্যবহার করছেন।
সারি বনাম কলাম প্রধান যে বিবৃতিটি কেবল একটি নোটেশনাল কনভেনশন, এটি সম্পূর্ণ সত্য। ম্যাট্রিক্স গুণ এবং ম্যাট্রিক্স / ভেক্টর গুণ এর যান্ত্রিকগুলি কনভেনশন নির্বিশেষে একই রকম।
কী পরিবর্তন হয় ফলাফলের অর্থ।
সর্বোপরি একটি 4x4 ম্যাট্রিক্স কেবলমাত্র 4x4 সংখ্যার গ্রিড। এটা না আছে তুল্য সিস্টেম পরিবর্তনের পড়ুন। যাইহোক, আপনি একবার কোনও নির্দিষ্ট ম্যাট্রিক্সকে অর্থ নির্ধারণ করার পরে, আপনাকে এখন এটিতে কী সঞ্চিত রয়েছে এবং এটি কীভাবে ব্যবহার করতে হবে তা জানতে হবে।
অনুবাদ ম্যাট্রিক্স নিন যা আমি আপনাকে উপরে দেখিয়েছি। এটি একটি বৈধ ম্যাট্রিক্স। আপনি সেই ম্যাট্রিক্সকে float[16]
দুটি উপায়ে যেকোন একটিতে সঞ্চয় করতে পারেন:
float row_major_t[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1};
float column_major_t[16] = {1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1};
তবে, আমি বলেছিলাম যে এই অনুবাদ ম্যাট্রিক্সটি ভুল, কারণ অনুবাদটি ভুল জায়গায়। আমি স্পষ্টভাবে বলেছি যে অনুবাদ ম্যাট্রিকগুলি কীভাবে তৈরি করা যায় তার জন্য এটি আদর্শ কনভেনশনের তুলনায় স্থানান্তরিত হয়, যা দেখতে এটির মতো হওয়া উচিত:
1 0 0 x
0 1 0 y
0 0 1 z
0 0 0 1
এগুলি কীভাবে সংরক্ষণ করা হয় তা দেখুন:
float row_major[16] = {1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1};
float column_major[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1};
লক্ষ করুন যে, column_major
হয় ঠিক একই হিসাবে row_major_t
। সুতরাং, আমরা যদি একটি যথাযথ অনুবাদ ম্যাট্রিক্স গ্রহণ করি এবং এটি কলাম-মেজর হিসাবে সঞ্চয় করি তবে এটি সেই ম্যাট্রিক্সটি স্থানান্তর এবং সারি-মেজর হিসাবে সংরক্ষণের সমান as
এটি কেবল একটি নোটেশনাল কনভেনশন হওয়ার অর্থ। সত্যিকারের দুটি কনভেনশন রয়েছে: মেমরি স্টোরেজ এবং স্থানান্তর osition মেমরি স্টোরেজটি কলাম বনাম সারি প্রধান, অন্যদিকে স্থানান্তর স্বাভাবিক বনাম ট্রান্সপোজড হয়।
আপনার যদি এমন একটি ম্যাট্রিক্স রয়েছে যা সারি-প্রধান ক্রমে উত্পন্ন হয়েছিল, আপনি সেই ম্যাট্রিক্সের কলাম-প্রধান সমতুল্য স্থানান্তর করে একই প্রভাব পেতে পারেন। এবং বিপরীতভাবে.
ম্যাট্রিক্সের গুণটি কেবল একটি উপায়ে করা যেতে পারে: একটি নির্দিষ্ট ক্রমে দুটি ম্যাট্রিক দেওয়া হলে আপনি নির্দিষ্ট মানগুলিকে একসাথে গুণান এবং ফলাফলগুলি সংরক্ষণ করেন। এখন, A*B != B*A
তবে এর আসল উত্স কোডটি কোডের A*B
মতো B*A
। তারা উভয়ই আউটপুট গণনা করতে একই কোড চালায়।
ম্যাট্রিক্স গুণক কোড ম্যাট্রিকগুলি কলাম-মেজর বা সারি-প্রধান ক্রমে সংরক্ষণ করা হবে কিনা তা বিবেচনা করে না।
ভেক্টর / ম্যাট্রিক্স গুণনের ক্ষেত্রে একই কথা বলা যায় না । এবং কেন এখানে।
ভেক্টর / ম্যাট্রিক্সের গুণটি মিথ্যা; এটা করা যায় না। যাইহোক, আপনি একটি ম্যাট্রিক্সকে অন্য ম্যাট্রিক্স দিয়ে গুণ করতে পারেন । সুতরাং যদি আপনি ভেক্টরকে ম্যাট্রিক্স হিসাবে ভান করেন তবে আপনি কার্যকরভাবে ম্যাট্রিক্স / ম্যাট্রিক্স গুণন করে ভেক্টর / ম্যাট্রিক্স গুণ করতে পারেন।
একটি 4 ডি ভেক্টরকে কলাম-ভেক্টর বা একটি সারি-ভেক্টর হিসাবে বিবেচনা করা যেতে পারে। অর্থাৎ, 4 ডি ভেক্টরকে 4x1 ম্যাট্রিক্স হিসাবে মনে করা যেতে পারে (মনে রাখবেন: ম্যাট্রিক্স নোটেশনে সারি গণনাটি প্রথম আসে) বা একটি 1x4 ম্যাট্রিক্স x
তবে এখানে জিনিসটি দেওয়া হয়েছে: দুটি ও দুটি এ্যাটাক্ট বি দেওয়া হয়েছে A*B
কেবল তখনই সংজ্ঞায়িত করা হয় যদি ক এর কলামগুলির সংখ্যা বি এর সারিগুলির সংখ্যার সমান হয় তাই, যদি A আমাদের 4x4 ম্যাট্রিক্স হয়, বি অবশ্যই 4 টি সারি সহ একটি ম্যাট্রিক্স হতে হবে এটা. সুতরাং, আপনি সঞ্চালন করতে পারবেন না A*x
, যেখানে এক্স একটি সারি-ভেক্টর । একইভাবে, আপনি x*A
যেখানে এক্স কলাম-ভেক্টর সেখানে সঞ্চালন করতে পারবেন না ।
এই কারণে, সবচেয়ে ম্যাট্রিক্স গণিত লাইব্রেরি এই ধৃষ্টতা করতে: আপনি সংখ্যাবৃদ্ধি একটি ভেক্টর বার ম্যাট্রিক্স, আপনি কি সত্যিই গুণ যে আসলে কি অর্থ কাজ করে , না যে এক কোন মানে নেই।
নিম্নলিখিত 4D ভেক্টর এক্স এর জন্য, সংজ্ঞায়িত করা যাক। C
কলাম-ভেক্টর হইবে ম্যাট্রিক্স আকারে x
, এবং R
সারি-ভেক্টর হইবে ম্যাট্রিক্স আকারে x
। এটি প্রদত্ত, যে কোনও 4x4 ম্যাট্রিক্স এ এর A*C
জন্য কলাম-ভেক্টর দ্বারা ম্যাট্রিক্স গুণমান এ উপস্থাপন করে x
। এবং R*A
ম্যাট্রিক্সকে x
এ - দ্বারা সারি-ভেক্টরকে গুণিত করে উপস্থাপন করে
তবে আমরা যদি কঠোর ম্যাট্রিক্স গণিত ব্যবহার করে এটি দেখি তবে আমরা দেখতে পাব যে এগুলি সমতুল্য নয় । হিসাবে একই হতে R*A
পারে নাA*C
। এটি কারণ একটি সারি-ভেক্টর কলাম-ভেক্টর হিসাবে একই জিনিস নয়। তারা একই ম্যাট্রিক্স নয়, তাই তারা একই ফলাফল দেয় না।
তবে এগুলি এক উপায়ে সম্পর্কিত। এটা সত্য যে R != C
। তবে এটিও সত্য যে , টি হ'ল ট্রান্সপোজ অপারেশন। দুটি ম্যাট্রিকগুলি একে অপরের ট্রান্সপোজ হয়।R = CT
এখানে একটি মজার ঘটনা। যেহেতু ভেক্টরগুলিকে ম্যাট্রিক হিসাবে বিবেচনা করা হয়, তাই তাদেরও একটি কলাম বনাম সারি-প্রধান স্টোরেজ প্রশ্ন রয়েছে। সমস্যাটি হ'ল উভয়ই দেখতে একই রকম । ভাসমানগুলির অ্যারে একই, সুতরাং আপনি কেবল ডাটা দেখে আর আর সি এর মধ্যে পার্থক্য বলতে পারবেন না। শুধুমাত্র পার্থক্য বলতে তারা কিভাবে ব্যবহার করা হয় হয়।
আপনার যদি দুটি ও এ এবং বি দুটি ম্যাট্রিক থাকে এবং ক সারি-মেজর এবং বি কলাম-মেজর হিসাবে সঞ্চিত থাকে তবে সেগুলি গুণ করা সম্পূর্ণ অর্থহীন । ফলস্বরূপ আপনি বকাবকি পান। সত্যিই ভাল না. গাণিতিকভাবে, আপনি যা পান তা হ'ল সমান । বা ; তারা গাণিতিকভাবে অভিন্ন।AT*B
A*BT
সুতরাং, দুটি ম্যাট্রিক (যদি মনে রাখবেন যে ভেক্টর / ম্যাট্রিক্স গুণন কেবল ম্যাট্রিক্সের গুণ) একই প্রধান ক্রমে সংরক্ষণ করা হয় তবে ম্যাট্রিক্স গুণফলটি কেবল তখনই বোধগম্য হয়।
সুতরাং, কোনও ভেক্টর কলাম-প্রধান বা সারি-প্রধান? এটি উভয় এবং উভয়ই নয়, যেমনটি আগেই বলা হয়েছিল। এটি কলাম ম্যাট্রিক্স হিসাবে ব্যবহৃত হয় কেবল তখনই কলামটি বড় হয় এবং এটি সারি ম্যাট্রিক্স হিসাবে ব্যবহৃত হলে এটি সারি প্রধান হয়।
অতএব, আপনার যদি ম্যাট্রিক্স এ থাকে যা কলাম প্রধান, এর x*A
অর্থ ... কিছুই নয়। ঠিক আছে, আবারও এর অর্থ হ'ল তবে আপনি যা চেয়েছিলেন তা এটি নয়। একইভাবে, সারি-প্রধান হলে ট্রান্সপোসড গুণটি করে ।x*AT
A*x
A
অতএব, ভেক্টর / ম্যাট্রিক্স গুণ ক্রম করে ডেটার আপনার প্রধান ক্রম উপর নির্ভর করে, পরিবর্তন (এবং আপনি পক্ষান্তরিত ম্যাট্রিক্স ব্যবহার করছেন কিনা)।
নীচের কোডের স্নিপেটে কেন r! = R2 হয়
কারণ আপনার কোডটি নষ্ট এবং বগি। গাণিতিকভাবে ,। আপনি যদি এই ফলাফলটি না পান, তবে হয় আপনার সমতা পরীক্ষাটি ভুল (ভাসমান-পয়েন্ট যথার্থ সমস্যা) বা আপনার ম্যাট্রিক্সের গুণক কোডটি ভেঙে গেছে।A * (B * C) == (CT * BT) * AT
কেন পোস্ট 3! = পোস্ট
কারণ তা বোঝা যায় না। শুধুমাত্র পথ যদি সত্য হয় হবে হতে । এবং এটি কেবলমাত্র প্রতিসম ম্যাট্রিক্সের ক্ষেত্রেই সত্য।A * t == AT * t
A == AT