কেউ কলম বনাম সারি এর গুণাগুণ / উপসংহারের মূল কারণগুলি ব্যাখ্যা করতে পারে?


11

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

আমি যা বুঝতে পারি না তা কেবল 'নোটেশনাল কনভেনশন' বলতে বোঝায় - এখানে এবং এখানে নিবন্ধগুলি থেকে লেখকরা দৃsert়রূপে উপস্থিত হন যে ম্যাট্রিক্স কীভাবে সংরক্ষণ করা হয়, বা জিপিইউতে স্থানান্তরিত করা যায় তার সাথে এটি কোনও পার্থক্য করে না, তবে দ্বিতীয়টিতে পৃষ্ঠা যে ম্যাট্রিক্স স্পষ্টভাবে এটি সারি-মেজর জন্য স্মৃতিতে রাখা হবে সমতুল্য নয় ; এবং আমি যদি আমার প্রোগ্রামে একটি জনবহুল ম্যাট্রিক্সের দিকে লক্ষ্য করি তবে আমি অনুবাদ উপাদানগুলি 4 র্থ, অষ্টম এবং 12 তম উপাদানগুলিকে দখল করতে দেখছি।

দেত্তয়া আছে:

"কলাম-প্রধান ম্যাট্রিক্সের সাথে পোস্ট-গুণিত কর সারি-প্রধান ম্যাট্রিক্সের সাথে প্রাক-গুণিত হিসাবে একই ফলাফল দেয়" "

নীচের কোডের স্নিপেটে কেন:

        Matrix4 r = t3 * t2 * t1;
        Matrix4 r2 = t1.Transpose() * t2.Transpose() * t3.Transpose();

R! = R2 এবং কেন পোস্ট 3 করে! = পোস্টগুলি এর জন্য :

        Vector4 pos = wvpM * new Vector4(0f, 15f, 15f, 1);
        Vector4 pos3 = wvpM.Transpose() * new Vector4(0f, 15f, 15f, 1);

ম্যাট্রিকগুলি সারি বা কলাম প্রধান কিনা তার উপর নির্ভর করে গুণক প্রক্রিয়াটি পরিবর্তন হয় , বা এটি কেবল আদেশ (সমতুল্য প্রভাবের জন্য?)

একটি জিনিস যা এটি আরও পরিষ্কার হয়ে উঠতে সহায়তা করে না, তা হ'ল ডাইরেক্টএক্স-এ সরবরাহ করা হলে, আমার কলামের বড় ডাব্লুভিপি ম্যাট্রিক্সটি এইচএলএসএল কলটির সাথে উল্লম্ব রূপান্তরিত করতে সফলভাবে ব্যবহৃত হয়: মুল (ভেক্টর, ম্যাট্রিক্স) যার ফলশ্রুতি ভেক্টর হিসাবে ধরা হবে সারি-প্রধান , সুতরাং কীভাবে আমার গণিতের লাইব্রেরি দ্বারা সরবরাহ করা কলামের প্রধান ম্যাট্রিক্স কাজ করতে পারে?



উত্তর:


11

আমি যদি আমার প্রোগ্রামে একটি জনবহুল ম্যাট্রিক্সের দিকে লক্ষ্য করি তবে আমি অনুবাদ উপাদানগুলি 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*BA*BT

সুতরাং, দুটি ম্যাট্রিক (যদি মনে রাখবেন যে ভেক্টর / ম্যাট্রিক্স গুণন কেবল ম্যাট্রিক্সের গুণ) একই প্রধান ক্রমে সংরক্ষণ করা হয় তবে ম্যাট্রিক্স গুণফলটি কেবল তখনই বোধগম্য হয়।

সুতরাং, কোনও ভেক্টর কলাম-প্রধান বা সারি-প্রধান? এটি উভয় এবং উভয়ই নয়, যেমনটি আগেই বলা হয়েছিল। এটি কলাম ম্যাট্রিক্স হিসাবে ব্যবহৃত হয় কেবল তখনই কলামটি বড় হয় এবং এটি সারি ম্যাট্রিক্স হিসাবে ব্যবহৃত হলে এটি সারি প্রধান হয়।

অতএব, আপনার যদি ম্যাট্রিক্স এ থাকে যা কলাম প্রধান, এর x*Aঅর্থ ... কিছুই নয়। ঠিক আছে, আবারও এর অর্থ হ'ল তবে আপনি যা চেয়েছিলেন তা এটি নয়। একইভাবে, সারি-প্রধান হলে ট্রান্সপোসড গুণটি করে ।x*ATA*xA

অতএব, ভেক্টর / ম্যাট্রিক্স গুণ ক্রম করে ডেটার আপনার প্রধান ক্রম উপর নির্ভর করে, পরিবর্তন (এবং আপনি পক্ষান্তরিত ম্যাট্রিক্স ব্যবহার করছেন কিনা)।

নীচের কোডের স্নিপেটে কেন r! = R2 হয়

কারণ আপনার কোডটি নষ্ট এবং বগি। গাণিতিকভাবে ,। আপনি যদি এই ফলাফলটি না পান, তবে হয় আপনার সমতা পরীক্ষাটি ভুল (ভাসমান-পয়েন্ট যথার্থ সমস্যা) বা আপনার ম্যাট্রিক্সের গুণক কোডটি ভেঙে গেছে।A * (B * C) == (CT * BT) * AT

কেন পোস্ট 3! = পোস্ট

কারণ তা বোঝা যায় না। শুধুমাত্র পথ যদি সত্য হয় হবে হতে । এবং এটি কেবলমাত্র প্রতিসম ম্যাট্রিক্সের ক্ষেত্রেই সত্য।A * t == AT * tA == AT


@ নিকল, সবকিছু এখন ক্লিক করতে শুরু করছে। আমার গ্রন্থাগারটি (অ্যাক্সিয়ম থেকে নেওয়া) কলাম-মেজর হিসাবে ঘোষণা করেছে (এবং সমস্ত গুণের অর্ডার ইত্যাদি এটি মেনে চলছে ) তবুও স্মৃতি বিন্যাসটি সারি রয়েছে বলে আমি যা দেখছিলাম এবং আমার কী হওয়া উচিত বলে মনে হয়েছিল তার মধ্যে সংযোগ বিচ্ছিন্ন হওয়ার কারণে সেখানে বিভ্রান্তি দেখা দিয়েছে -মজোর (অনুবাদ সূচকগুলি বিবেচনা করে এবং এইচএলএসএল অ-স্থানান্তরিত ম্যাট্রিক্স ব্যবহার করে সঠিকভাবে কাজ করে); আমি এখন দেখছি কিভাবে এটি বিরোধে নয়। আপনাকে অনেক ধন্যবাদ!
sebf

2
"প্রায় একটি সাধারণ অনুবাদ ম্যাট্রিক্স" এবং "যা একেবারে আবর্জনা বলে মনে হয়" এর মতো কথা বলার জন্য আমি আপনাকে প্রায় 1-1 দিয়েছিলাম। তারপরে আপনি এগিয়ে যান এবং সুন্দরভাবে ব্যাখ্যা করুন যে তারা কেন সম্পূর্ণ সমতুল্য এবং তাই উভয়ই অন্যটির চেয়ে বেশি "প্রাকৃতিক" নয়। আপনি কেন শুরু থেকেই এই ছোট্ট আজেবাজে কথা সরাবেন না? আপনার উত্তর বাকী আসলে ভাল ভাল। (এছাড়াও, আগ্রহীদের জন্য: স্টিভ। হোল্ল্যাশ.ট. / সিগাইন্ডেক্স / ম্যাথ / ম্যাট্রিক্স / কলাম / ওয়েভ এইচটিএমএল )
ইমার ২

2
@ আইমরে: কারণ এটি বোকামি নয়। দুটি সম্মেলন করা বিভ্রান্তিকর কারণে সম্মেলনগুলি গুরুত্বপূর্ণ। গণিতবিদগণ দীর্ঘদিন আগে ম্যাট্রিকের জন্য সম্মেলনে বসতি স্থাপন করেছিলেন । "ট্রান্সপোজড ম্যাট্রিকেস" (নামকরণের কারণে তারা মান থেকে স্থানান্তরিত হয়) এই কনভেনশনটির লঙ্ঘন। যেহেতু তারা সমতুল্য, তাই তারা ব্যবহারকারীর কোনও আসল সুবিধা দেয় না। এবং যেহেতু এগুলি পৃথক এবং অপব্যবহার করা যায় তাই এটি বিভ্রান্তি সৃষ্টি করে। অথবা এটিকে অন্যভাবে বলতে গেলে, যদি ট্রান্সপোজড ম্যাট্রিক্সের অস্তিত্ব না থাকে, তবে ওপি কখনও এটি জিজ্ঞাসা করতে পারে না। এবং তাই, এই বিকল্প সম্মেলন বিভ্রান্তি সৃষ্টি করে।
নিকল বোলাস

1
@ নিকোল: 12-13-14-এ অনুবাদ থাকা একটি ম্যাট্রিক্স এখনও সারি-প্রধান হতে পারে - যদি আমরা এরপরে সারি ভেক্টর ব্যবহার করি (এবং ভিএম হিসাবে গুণিত)। ডাইরেক্টএক্স দেখুন। অথবা এটি কলাম-মেজর হিসাবে দেখা যেতে পারে, কলাম ভেক্টর (এমভি, ওপেনজিএল) এর সাথে ব্যবহৃত হয়। এটা আসলে একই। বিপরীতে, যদি কোনও ম্যাট্রিক্সের অনুবাদ 3-7-11-এ হয়, তবে এটি কলাম ভেক্টরগুলির সাথে একটি সারি-প্রধান ম্যাট্রিক্স বা সারি ভেক্টরগুলির সাথে কলাম-মেজর হিসাবে দেখা যেতে পারে। 12-13-14 সংস্করণটি প্রকৃতপক্ষে আরও সাধারণ, তবে আমার মতে 1) এটি আসলে কোনও মানদণ্ড নয় এবং 2) এটিকে কলাম-প্রধান বলা বিভ্রান্তিমূলক হতে পারে, কারণ এটি অগত্যা নয়।
imre

1
@ আইমরে: এটি স্ট্যান্ডার্ড। যেকোন প্রকৃত প্রশিক্ষিত গণিতবিদকে জিজ্ঞাসা করুন অনুবাদটি কোথায় যায় এবং তারা আপনাকে বলবে যে এটি চতুর্থ কলামে গেছে। গণিতবিদগণ ম্যাট্রিক্স আবিষ্কার করেছিলেন ; তারাই সম্মেলন স্থির করে down
নিকল বোলাস

3

এখানে কর্মক্ষেত্রে দুটি পৃথক পছন্দ রয়েছে। একটি হ'ল আপনি সারি ভেক্টর বা কলাম ভেক্টর ব্যবহার করেন এবং এই সম্মেলনের জন্য ম্যাট্রিকগুলি একে অপরের স্থানান্তর oses

অন্যটি হচ্ছে আপনি ম্যাট্রিকগুলিকে সারি-প্রধান ক্রমে বা কলাম-প্রধান ক্রমে মেমরিতে সঞ্চয় করেন কিনা । নোট করুন যে "সারি-মেজর" এবং "কলাম-মেজর" সারি-ভেক্টর / কলাম-ভেক্টর সম্মেলনটি আলোচনার জন্য সঠিক পদ নয় ... যদিও অনেকে তাদের অপব্যবহার করে। সারি-প্রধান এবং কলাম-প্রধান মেমরি লেআউটগুলিও একটি ট্রান্সপোজ দ্বারা আলাদা হয়।

ওপেনজিএল একটি কলাম ভেক্টর কনভেনশন এবং কলাম-প্রধান স্টোরেজ অর্ডার ব্যবহার করে এবং ডি 3 ডি একটি সারি ভেক্টর কনভেনশন এবং সারি-প্রধান স্টোরেজ অর্ডার ব্যবহার করে (ভাল - কমপক্ষে D3DX, গণিতের গ্রন্থাগারটি করে) তাই দুটি ট্রান্সপোজ বাতিল হয়ে যায় এবং এটি পরিণত হয় out একই মেমরি লেআউট ওপেনজিএল এবং ডি 3 ডি উভয়ের জন্যই কাজ করে। অর্থাত, মেমরিতে ক্রমানুসারে সঞ্চিত 16 টি ফ্লোটের একই তালিকা উভয় এপিআইতে একইভাবে কাজ করবে।

এটি লোকেরা বলতে চাইলে "ম্যাট্রিক্স কীভাবে সংরক্ষণ করা হয়, বা জিপিইউতে স্থানান্তরিত হয় তাতে কোনও পার্থক্য নেই" বলতে এই অর্থ হতে পারে।

আপনার কোড স্নিপেটের জন্য, আর! = আর 2 কারণ কোনও পণ্য স্থানান্তরের নিয়মটি (এবিসি) ^ টি = সি ^ টিবি ^ টিএ ^ টি। ট্রান্সপজিশনটি অর্ডারের সাথে প্রকাশের মাধ্যমে বহুগুণে বিতরণ করে। সুতরাং আপনার ক্ষেত্রে আপনার r.Transpose () == r2 হওয়া উচিত, r == r2 নয়।

তেমনিভাবে, পোস্ট! = পজ 3 কারণ আপনি স্থানান্তর করেছেন তবে গুণটির ক্রমটি বিপরীত হয়নি। আপনার ডাব্লুপিভিএম * লোকালপোস == লোকালপোস * ডাব্লুভিপিএম.ট্রান্সপোজ () পাওয়া উচিত। ম্যাট্রিক্সের বাম দিকে গুন করার সময় ভেক্টরটি স্বয়ংক্রিয়ভাবে একটি সারি ভেক্টর হিসাবে ব্যাখ্যা করা হয় এবং ম্যাট্রিক্সের ডানদিকে গুণিতকালে কলাম ভেক্টর হিসাবে ব্যবহৃত হয়। তা বাদে, কীভাবে গুণ করা হয় তার কোনও পরিবর্তন নেই।

পরিশেষে, পুনরায়: "আমার কলামের বড় ডাব্লুভিপি ম্যাট্রিক্স এইচএলএসএল কলটির সাহায্যে শিখুনকে রূপান্তর করতে সফলভাবে ব্যবহৃত হয়: মুল (ভেক্টর, ম্যাট্রিক্স)," আমি এ সম্পর্কে অনিশ্চিত, তবে সম্ভবত বিভ্রান্তি / কোনও বাগ ম্যাট্রিক্স থেকে বেরিয়ে আসতে পেরেছিল ইতোমধ্যে গণিতের পাঠাগারটি স্থানান্তরিত হয়েছে।


1

3 ডি গ্রাফিকগুলিতে আপনি ভেক্টর এবং পয়েন্ট উভয়কেই রূপান্তর করতে ম্যাট্রিক্স ব্যবহার করেন। আপনি অনুবাদ ম্যাট্রিক্সের বিষয়ে কথা বলছেন এই বিষয়টি বিবেচনা করে, আমি কেবলমাত্র পয়েন্টগুলি সম্পর্কেই কথা বলব (আপনি একটি ম্যাট্রিক্সের সাথে কোনও ভেক্টর অনুবাদ করতে পারবেন না, বা এটি আরও ভাল করে বলছেন, আপনি একই ভেক্টরটি পাবেন তবে)।

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

একটি বিন্দু (বা ভেক্টর) 3 টি উপাদান (x, y, z) দ্বারা উপস্থাপিত হয় এবং এটি একটি সারি বা কলাম উভয়ের মতো বিবেচনা করা যেতে পারে:

কলাম (মাত্রা 3 এক্স 1):

| এক্স |

| Y |

| Z- র |

অথবা

সারি (মাত্রা 1 এক্স 3):

| X, Y, Z |

আপনি পছন্দসই কনভেনশন চয়ন করতে পারেন, এটি কেবল একটি সম্মেলন। এটি টি অনুবাদ ম্যাট্রিক্স বলা যাক। আপনি যদি প্রথম সম্মেলনটি চয়ন করেন, ম্যাট্রিক্সের জন্য একটি পয়েন্ট পি গুণিত করার জন্য আপনাকে একটি পোস্টের গুণক ব্যবহার করতে হবে:

টি * ভি (মাত্রা 3x3 * 3x1)

অন্যথায়:

ভি * টি (মাত্রা 1x3 * 3x3)

লেখকরা দৃ as়রূপে উপস্থিত হন যে ম্যাট্রিক্স কীভাবে সংরক্ষণ করা হয়, বা জিপিইউতে স্থানান্তরিত করা তাতে কোনও পার্থক্য নেই

আপনি যদি সর্বদা একই কনভেনশন ব্যবহার করেন তবে এটি কোনও পার্থক্য করে না। এর অর্থ এই নয় যে বিভিন্ন কনভেনশনের ম্যাট্রিক্সের একই মেমরির উপস্থাপনা থাকবে তবে 2 টি ভিন্ন কনভেনশনের সাথে আপনি একটি পয়েন্ট রূপান্তরকারী একই ধরণের রূপান্তরিত পয়েন্ট পাবেন:

পি 2 = বি * এ * পি 1; // প্রথম সম্মেলন

পি 3 = পি 1 * এ * বি; // দ্বিতীয় সম্মেলন

পি 2 == পি 3;


1

আমি দেখতে পেয়েছি অনুবাদ উপাদানগুলি 4 র্থ, অষ্টম এবং 12 তম উপাদানগুলি দখল করে মানে আপনার ম্যাট্রিকগুলি "ভুল"।

অনুবাদ উপাদান সবসময় এন্ট্রি হিসাবে নির্দিষ্ট # 13, # 14 এবং # 15 রূপান্তর ম্যাট্রিক্স (এর উপাদান # 1 যেমন অ্যারের প্রথম উপাদান বেড়ে চলেছে )।

একটি সারি প্রধান রূপান্তর ম্যাট্রিক্স এর মতো দেখাচ্ছে:

[ 2 2 2 1 ]   R00 R01 R02 0  
              R10 R11 R12 0 
              R20 R21 R22 0 
              t.x t.y t.z 1 

একটি কলামের প্রধান রূপান্তর ম্যাট্রিক্স এর মতো দেখাচ্ছে:

 R00 R01 R02 t.x   2  
 R10 R11 R12 t.y   2 
 R20 R21 R22 t.z   2 
  0   0   0   1    1 

সারি প্রধান ম্যাট্রিকগুলি সারি নীচে নির্দিষ্ট করা হয়

উপরে সারি প্রধান ম্যাট্রিক্সকে রৈখিক অ্যারে হিসাবে ঘোষণা করে আমি লিখব:

ROW_MAJOR = { R00, R01, R02, 0,  // row 1 // very intuitive
              R10, R11, R12, 0,  // row 2
              R20, R21, R22, 0,  // row 3
              t.x, t.y, t.z, 1 } ; // row 4

এটা খুব স্বাভাবিক মনে হয়। কারণ বিজ্ঞপ্তি, ইংরাজিকে "সারি-মেজর" লেখা আছে - ম্যাট্রিক্স উপরের লেখায় ঠিক যেমনটি গণিতে আসবে তেমন প্রদর্শিত হবে।

এবং এখানে বিভ্রান্তির বিষয়টি।

কলামের বড় ম্যাট্রিকগুলি কলামগুলির নীচে গিয়ে নির্দিষ্ট করা আছে

এর অর্থ কোডে লিনিয়ার অ্যারে হিসাবে কলামের বড় রূপান্তর ম্যাট্রিক্সটি নির্দিষ্ট করতে হবে, আপনাকে লিখতে হবে:

    COLUMN_MAJOR = {R00, R10, R20, 0, // COLUMN # 1 // খুব পাল্টা-স্বজ্ঞাত
                     R01, আর 11, আর 21, 0,
                     আর 02, আর 12, আর 22, 0,
                     tx, ty, tz, 1};

নোট করুন এটি সম্পূর্ণ পাল্টা স্বজ্ঞাত !! লিনিয়ার অ্যারে শুরু করার সময় একটি কলাম মেজিক ম্যাট্রিক্স এর কলামগুলি নীচে নির্দিষ্ট করে থাকে , সুতরাং প্রথম লাইন

COLUMN_MAJOR = { R00, R10, R20, 0,

ম্যাট্রিক্সের প্রথম কলামটি নির্দিষ্ট করে :

 R00
 R10
 R20
  0 

এবং প্রথম সারিতে নয় , পাঠ্যের সাধারণ বিন্যাস হিসাবে আপনি বিশ্বাস করতে পারেন। কোডে দেখলে আপনাকে মানসিকভাবে কোনও কলামের বড় ম্যাট্রিক্স স্থানান্তর করতে হবে, কারণ নির্দিষ্ট করা প্রথম 4 উপাদান আসলে প্রথম কলামটি বর্ণনা করে। আমি মনে করি এ কারণেই প্রচুর লোক কোডে সারি-প্রধান ম্যাট্রিকগুলি পছন্দ করে (ডিআইআরইসিটি 3 ডি! কাশি!)

সুতরাং, অনুবাদ উপাদানগুলি সর্বদা লিনিয়ার অ্যারে সূচকগুলিতে থাকে # 13, # 14, এবং # 15 (যেখানে প্রথম উপাদানটি # 1 হয়), আপনি নির্বিশেষে সারি মেজর বা কলামের বড় ম্যাট্রিক ব্যবহার করছেন।

আপনার কোড দিয়ে কী ঘটেছে এবং এটি কেন কাজ করে?

আপনার কোডে যা ঘটছে তা হ'ল, আপনার একটি কলাম মেজিক-ম্যাট্রিক্স হ্যাঁ, তবে আপনি অনুবাদ উপাদানগুলি ভুল জায়গায় রেখেছেন। আপনি ম্যাট্রিক্স স্থানান্তর করার সময়, প্রবেশ # 4 এন্ট্রি # 13 এ যায়, প্রবেশ # 8 থেকে # 13, এবং এন্ট্রি # 12 থেকে # 15 হয়। এবং সেখানে আপনি এটা আছে।


0

সহজভাবে বলতে গেলে, পার্থক্যের কারণ হ'ল ম্যাট্রিক্সের গুণটি কমটিভেটিভ নয় । সংখ্যার নিয়মিত গুনের সাথে, যদি এ * বি = সি হয় তবে এটি অনুসরণ করে যে বি * এও = সি। ম্যাট্রিক্সের ক্ষেত্রে এটি হয় না। এজন্য সারি-প্রধান বা কলাম-প্রধান বিষয়গুলি বেছে নেওয়া।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.