تالار گفتمان مانشت
ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - نسخه‌ی قابل چاپ

ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - zeinab - 18 آبان ۱۳۹۲ ۱۲:۵۶ ب.ظ

میدونین که برای جلوگیری از هدر رفتن فضای حافظه ، ماتریس بالا مثلثی رو در یک آرایه یک بعدی ذخیره میکنیم.
که برای یافتن مکان عنصر [tex]A\left [ i,j \right ][/tex] از فرمول [tex][ (\left ( j-1 \right )*j)/2\left \right ] i[/tex]
استفاده میشه!!
میخوام بدونم چجوری بدست اومده؟؟
تقریبا میدونم !! اما این [tex]j/2[/tex] نمیدونم از کجا اومده!!
اگر میشه کامل توضیح بدین. مرسی

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - Masoud05 - 25 آبان ۱۳۹۲ ۱۰:۵۵ ب.ظ

ماتریس زیر رو در نظر بگرید

۱ ۱ ۱ ۱
۱ ۱ ۱ ۰
۱ ۱ ۰ ۰
۱ ۰ ۰ ۰


فرض کنید آدرس مثلا خونه [۴,۴] رو میخواید. قبول دارید در ستون آخر ۴ تا ۱ هست ( در واقع در ستون اخر به اندازه بعد ماتریس ۱ هست) پس یه ۴ اینجا داریم ( همون مقدار i که شما تو فرمول آوردید)

حالا قبول داری در سطر اول یک عدد ۱، در ستون دوم ۲ عدد ۱ و در ستون سوم ۳ عدد ۱ داری که یه سری تولید میکنه بفرم زیر :
[tex]n(n 1)/2[/tex]

یکم اینجا عجیب شد تو فرمولی که گفتید n-1 هست اما تو فرمول من n+1 ، دلیلش ساده هست ، شما داری برا ستون ۴ کار میکنی و مقدار ستون = ۴ هست اما من دارم رو ستون ۱ تا ۳ بحث میکنم، این اختلاف از این اومده

راحت میتونم رو کاغذ توضیح بدم اما نوشتنش اینجا سخته Big Grin

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - zeinab - 26 آبان ۱۳۹۲ ۱۱:۲۱ ق.ظ

سلام مرسی. اینو فهمیدم! اما
یه فرمول داریم که برای بدست آوردن آدرس [tex]A\left [ i,j \right ][/tex] ، در ذخیره کردن ماتریس بصورت سطری یا ستونی ، ازش استفاده میکنیم . میخواستم بدونم بر اساس اون میتونیم این فرمول رو هم بدست بیاریم؟؟ اگر آره ، لطفا بر اساس اون برام توضیح بدین.

در واقع فکر کنم این چیزی که شما گفتین همونه!! اما فرمولیش این نمیشه Big Grin
اینجوری میشه
[tex]A\left [ i,j \right ]=\left [ \left ( i-1 \right )\left ( n\left ( n 1 \right )/2 \right ) \left ( j-1 \right ) \right ] 1[/tex]
[tex]A\left [ i,j \right ][/tex]

که ماتریس B رو به این صورت در نظر گرفتم [tex]B\left [ 1..1,1..n\left ( \left ( n 1 \right )/2 \right ) \right ][/tex]
که همون ماتریس یک بعدی مون هست!!

این فرمولی که نوشتم برا ماتریس پایین مثلثی هست که بصورت سطری ذخیره میشه!!

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - bahman2000 - 26 آبان ۱۳۹۲ ۰۲:۰۵ ب.ظ

(۲۶ آبان ۱۳۹۲ ۱۱:۲۱ ق.ظ)zeinab نوشته شده توسط:  سلام مرسی. اینو فهمیدم! اما
یه فرمول داریم که برای بدست آوردن آدرس [tex]A\left [ i,j \right ][/tex] ، در ذخیره کردن ماتریس بصورت سطری یا ستونی ، ازش استفاده میکنیم . میخواستم بدونم بر اساس اون میتونیم این فرمول رو هم بدست بیاریم؟؟ اگر آره ، لطفا بر اساس اون برام توضیح بدین.

در واقع فکر کنم این چیزی که شما گفتین همونه!! اما فرمولیش این نمیشه Big Grin
اینجوری میشه
[tex]A\left [ i,j \right ]=\left [ \left ( i-1 \right )\left ( n\left ( n 1 \right )/2 \right ) \left ( j-1 \right ) \right ] 1[/tex]
[tex]A\left [ i,j \right ][/tex]

که ماتریس B رو به این صورت در نظر گرفتم [tex]B\left [ 1..1,1..n\left ( \left ( n 1 \right )/2 \right ) \right ][/tex]
که همون ماتریس یک بعدی مون هست!!

این فرمولی که نوشتم برا ماتریس پایین مثلثی هست که بصورت سطری ذخیره میشه!!
با سلام:
اگر بخواهیم ماتریس n*n بالا مثلثی یا پایین مثلثی A را در یک آرایه ی یک بعدی B ذخیره کنیم به شرطی که فقط عناصر غیر صفر(غیرمهم) A در B ذخیره شوند ۴ حالت پیش می آید:
الف) ماتریس A بالا مثلثی باشد و بخواهیم عناصر مهم A را بصورت سطری در آرایه B ذخیره کنیم.
ب) ماتریس A پایین مثلثی باشد و بخواهیم عناصر مهم A را بصورت سطری در آرایه B ذخیره کنیم.
ج) ماتریس A بالا مثلثی باشد و بخواهیم عناصر مهم A را بصورت ستونی در آرایه B ذخیره کنیم.
د) ماتریس A پایین مثلثی باشد و بخواهیم عناصر مهم A را بصورت ستونی در آرایه B ذخیره کنیم.
[تصویر:  226012_20564036526071336558.jpg]
موارد الف و ج را نیز می توان به این شکل مورد بررسی قرار داد.

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - zeinab - 26 آبان ۱۳۹۲ ۰۵:۰۷ ب.ظ

(۲۶ آبان ۱۳۹۲ ۰۲:۰۵ ب.ظ)bahman2000 نوشته شده توسط:  
(26 آبان ۱۳۹۲ ۱۱:۲۱ ق.ظ)zeinab نوشته شده توسط:  سلام مرسی. اینو فهمیدم! اما
یه فرمول داریم که برای بدست آوردن آدرس [tex]A\left [ i,j \right ][/tex] ، در ذخیره کردن ماتریس بصورت سطری یا ستونی ، ازش استفاده میکنیم . میخواستم بدونم بر اساس اون میتونیم این فرمول رو هم بدست بیاریم؟؟ اگر آره ، لطفا بر اساس اون برام توضیح بدین.

در واقع فکر کنم این چیزی که شما گفتین همونه!! اما فرمولیش این نمیشه Big Grin
اینجوری میشه
[tex]A\left [ i,j \right ]=\left [ \left ( i-1 \right )\left ( n\left ( n 1 \right )/2 \right ) \left ( j-1 \right ) \right ] 1[/tex]
[tex]A\left [ i,j \right ][/tex]

که ماتریس B رو به این صورت در نظر گرفتم [tex]B\left [ 1..1,1..n\left ( \left ( n 1 \right )/2 \right ) \right ][/tex]
که همون ماتریس یک بعدی مون هست!!

این فرمولی که نوشتم برا ماتریس پایین مثلثی هست که بصورت سطری ذخیره میشه!!
با سلام:
اگر بخواهیم ماتریس n*n بالا مثلثی یا پایین مثلثی A را در یک آرایه ی یک بعدی B ذخیره کنیم به شرطی که فقط عناصر غیر صفر(غیرمهم) A در B ذخیره شوند ۴ حالت پیش می آید:
الف) ماتریس A بالا مثلثی باشد و بخواهیم عناصر مهم A را بصورت سطری در آرایه B ذخیره کنیم.
ب) ماتریس A پایین مثلثی باشد و بخواهیم عناصر مهم A را بصورت سطری در آرایه B ذخیره کنیم.
ج) ماتریس A بالا مثلثی باشد و بخواهیم عناصر مهم A را بصورت ستونی در آرایه B ذخیره کنیم.
د) ماتریس A پایین مثلثی باشد و بخواهیم عناصر مهم A را بصورت ستونی در آرایه B ذخیره کنیم.
[تصویر:  226012_20564036526071336558.jpg]
موارد الف و ج را نیز می توان به این شکل مورد بررسی قرار داد.

مرسی بازم نفهمیدم!! کلا هدف ما از ذخیره ماتریس های بالا و پایین مثلثی در یک آرایه یک بعدی ، اینه که عناصر غیر مهم یعنی صفرها ذخیره نشن!!
و من نفهمیدم که این فرمول چجوری بدست اومد!!

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - bahman2000 - 27 آبان ۱۳۹۲ ۱۲:۴۸ ق.ظ

در ابتدا بایستی تصحیح کنم که در ارسال قبلی فرمول ارائه شده برای سطری مربوط به آرایه پایین مثلثی بوده و فرمول ارائه شده برای ستونی مربوط به آرایه بالا مثلثی می باشد که به اشتباه هر دو فرمول را برای آرایه پایین مثلثی در نظر گرفته بودم.
و اما توضیح بیشتر در مورد سوالتان...
همانطور که ما وقتی می خواستیم آدرس درایه ی (a(i,j را با دانستن آدرس شروع(base) تعیین کنیم کاری که می کردیم این بود که اگر درایه ها به صورت سطری ذخیره شده بودند به تعداد سطر ها تا قبل رسیدن به سطری که درایه a انجا قرار دارد (تا سطر i-1)حرکت می کردیم سپس در سطر i به جلو حرکت می کردیم تا به ستون j برسیم و با اینکار عملا تعداد عناصر قبل از درایه (a(i,j را پیدا می کردیم و آن را در سایز نوع آرایه ضرب می کردیم و در نهایت به اضافه ی base می کردیم تا آدرس درایه ی a به دست آید.
حال با این دید برای ذخیره آرایه پایین مثلثی به روش الف) سطری: برای درایه (a(i,j که یکی از عناصر مهم می باشد و آن را در خانه ی t ام آرایه یک بعدی b ذخیره کرده ایم و t در اصل به معنی چندمین درایه مهم ذخیره شده در آرایه ی b است و در نهایت t برابر خواهد بود با تعداد عناصر مهم در سطر های بالای (a(i,j به اضافه ی تعداد عناصر مهم در خود سطر iام که با محاسبه ی این دو مقدار تعیین می کنیم که درایه a چندمین عنصر ذخیره شده در آرایه ی b خواهد بود.
تعداد عناصر مهم در سطر های بالای (a(i,j=
(i(i-1)/2=1+2+3+...+(i-1
تعداد عناصر مهم درسطر iام که قبل از درایه مورد نظر قرار گرفته اند(خودش نیز حساب میشود)=j
که با ترکیب همان فرمولی به دست می آید که در بالا برای پایین مثلثی در روش سطری بیان شد.
ب) ستونی
تعداد عناصر مهم در ستون های قبل (a(i,j=
...=(n+n-1+n-2+...+n-(j-2
تعداد عناصر مهم در خود ستون jام که بالای درایه مورد نظر قرار گرفته اند(خودش نیز حساب میشود)=n-j+1
که با ترکیب فرمولی به دست می آید که برای پایین مثلثی در روش ستونی می باشد.
با همین طرز فکر برای آرایه بالا مثلثی هم در روش سطری و هم در روش ستونی می توان فرمول هایی را استنتاج کرد.
در آخر امیدوارم که کاملا متوجه شده باشید.

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - zeinab - 27 آبان ۱۳۹۲ ۰۹:۵۴ ق.ظ

تشکر لطف کردی. فقط نمیدونم کی الکی بهمون منفی داده!!

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - zarinzri - 14 آبان ۱۳۹۳ ۰۸:۲۱ ب.ظ

سلام
چطوری یک آرایه یک بعدی رو میشه به یک ماتریس بالا مثلثی تبدیل کرد؟

RE: ذخیره ماتریس بالا و یا پایین مثلثی در یک آرایه یک بعدی - pioneer01 - 25 شهریور ۱۳۹۵ ۰۳:۴۵ ب.ظ

(۲۷ آبان ۱۳۹۲ ۱۲:۴۸ ق.ظ)bahman2000 نوشته شده توسط:  در ابتدا بایستی تصحیح کنم که در ارسال قبلی فرمول ارائه شده برای سطری مربوط به آرایه پایین مثلثی بوده و فرمول ارائه شده برای ستونی مربوط به آرایه بالا مثلثی می باشد که به اشتباه هر دو فرمول را برای آرایه پایین مثلثی در نظر گرفته بودم.
و اما توضیح بیشتر در مورد سوالتان...
همانطور که ما وقتی می خواستیم آدرس درایه ی (a(i,j را با دانستن آدرس شروع(base) تعیین کنیم کاری که می کردیم این بود که اگر درایه ها به صورت سطری ذخیره شده بودند به تعداد سطر ها تا قبل رسیدن به سطری که درایه a انجا قرار دارد (تا سطر i-1)حرکت می کردیم سپس در سطر i به جلو حرکت می کردیم تا به ستون j برسیم و با اینکار عملا تعداد عناصر قبل از درایه (a(i,j را پیدا می کردیم و آن را در سایز نوع آرایه ضرب می کردیم و در نهایت به اضافه ی base می کردیم تا آدرس درایه ی a به دست آید.
حال با این دید برای ذخیره آرایه پایین مثلثی به روش الف) سطری: برای درایه (a(i,j که یکی از عناصر مهم می باشد و آن را در خانه ی t ام آرایه یک بعدی b ذخیره کرده ایم و t در اصل به معنی چندمین درایه مهم ذخیره شده در آرایه ی b است و در نهایت t برابر خواهد بود با تعداد عناصر مهم در سطر های بالای (a(i,j به اضافه ی تعداد عناصر مهم در خود سطر iام که با محاسبه ی این دو مقدار تعیین می کنیم که درایه a چندمین عنصر ذخیره شده در آرایه ی b خواهد بود.
تعداد عناصر مهم در سطر های بالای (a(i,j=
(i(i-1)/2=1+2+3+...+(i-1
تعداد عناصر مهم درسطر iام که قبل از درایه مورد نظر قرار گرفته اند(خودش نیز حساب میشود)=j
که با ترکیب همان فرمولی به دست می آید که در بالا برای پایین مثلثی در روش سطری بیان شد.
ب) ستونی
تعداد عناصر مهم در ستون های قبل (a(i,j=
...=(n+n-1+n-2+...+n-(j-2
تعداد عناصر مهم در خود ستون jام که بالای درایه مورد نظر قرار گرفته اند(خودش نیز حساب میشود)=n-j+1
که با ترکیب فرمولی به دست می آید که برای پایین مثلثی در روش ستونی می باشد.
با همین طرز فکر برای آرایه بالا مثلثی هم در روش سطری و هم در روش ستونی می توان فرمول هایی را استنتاج کرد.
در آخر امیدوارم که کاملا متوجه شده باشید.

سلام دوست عزیز
شما میدونید اگه بخایم به صورت قطری ذخیره کنیم چطوری میشه؟ تا ی جایی نوشتم!