ماتریس پایین مثلثی و بالا مثلثی

sarav

New Member
ببخشید می خواستم بدونم وقتی ماتریس پایین مثلثی و بالا مثلثی رو تو آرایه یک بعدی ذخیره می کنیم
آدرسشو چطوری بدست میاریم به روش ستونی وسطری بازبون c
 

the_king

مدیرکل انجمن
ببخشید می خواستم بدونم وقتی ماتریس پایین مثلثی و بالا مثلثی رو تو آرایه یک بعدی ذخیره می کنیم
آدرسشو چطوری بدست میاریم به روش ستونی وسطری بازبون c

اگه مقدار 0 ها رو هم در آرایه ذخیره کنید دیگه در دسترسی به داده فرقی بین ماتریس پایین مثلثی و بالا مثلثی و
هر ماتریس دیگه ای نیست :

یک ماتریس n در n خانه ای در آرایه یک بعدی مثلا با نام آرایه a تعداد n * n خانه رو پر می کنه، اگه بخواهید آدرس
سطر i و ستون j این ماتریس را در آرایه پیدا کنید از فرمول زیر استفاده می شود :
کد:
x = i * n + j
یعنی [a[x یا [a[i * n + j نشان دهنده مقدار [matrix[i, j است.

اما اگر مقدار 0 ها رو در آرایه ذخیره نکنید، در ماتریس پایین مثلثی فرمول اینطوری میشه :
کد:
x = (i * i + i) / 2 + j
یعنی [a[x یا [a[(i * i + i) / 2 + j نشان دهنده مقدار [matrix[i, j است.

و در ماتریس بالا مثلثی فرمول اینطوری میشه :
کد:
x = i * n - (i * i - i) / 2 + j - i
یعنی [a[x یا [a[i * n - (i * i - i) / 2 + j - i نشان دهنده مقدار [matrix[i, j است.
 

sarav

New Member
ببخشید میشه یکم بیشتر توضیح بدید من این فرمولا رو گیچ شدم
اطلاعاتی که خودم دارمو می نویسم اگه می شه برام توضیح بدید
ماتریس بالا و پایین مثلثی را می توان در یک آرایه یک بعدی ذخیره کرد
ا.بالا مثلثی:
به صورت سطری در پاسکال i*i+i/2+j
به صورت ستونی:؟بلد نیستم
پایین مثلثی:به صورت سطری:i*i-i/2+j
به صورت ستونی:؟بلد نیستم
حالا من این فرمول ها را با زبان c می خواهم
ممنون
 

the_king

مدیرکل انجمن
ببخشید میشه یکم بیشتر توضیح بدید من این فرمولا رو گیچ شدم
اطلاعاتی که خودم دارمو می نویسم اگه می شه برام توضیح بدید
تصویر زیر رو ببینید، این یک ماتریس بالا مثلثی 4 در 4 است، یعنی n = 4
o9k7gn4qv9xoit7xpqkm.gif


طبق فرض مساله ما صرفا مقادیر غیر 0 رو ذخیره می کنیم، یعنی A و B و C و ... و J (مقادیر 0 رو در آرایه تک بعدی
قرار نمی دهیم) :
ns6n00fkyaqi21i5m4oh.gif


حالا شما بایستی فرمولی را بنویسید که شماره خانه در آرایه یک بعدی را از روی مقادیر سطر i و ستون j و
ابعاد ماتریس n بدست بیاورد، یعنی شما مقادیر i و j و n را به عنوان معلوم دارید و بایستی مجهول x را بدست بیاورید.

x = i * n - (i * i - i) / 2 + j - i

کدش هم در زبان C فرق خاصی با زبان های دیگه نداره، فرمول و کدش فرقی نداره، همینه که نوشتم.

اینم یک ماتریس پایین مثلثی :
17l38w9xklto1kyk9dse.gif


طبق فرض مساله ما صرفا مقادیر غیر 0 رو ذخیره می کنیم، یعنی A و B و C و ... و J (مقادیر 0 رو در آرایه تک بعدی
قرار نمی دهیم) :
ns6n00fkyaqi21i5m4oh.gif

حالا شما بایستی فرمولی را بنویسید که شماره خانه در آرایه یک بعدی را از روی مقادیر سطر i و ستون j و ابعاد
ماتریس n بدست بیاورد، یعنی شما مقادیر i و j و n را به عنوان معلوم دارید و بایستی مجهول x را بدست بیاورید.

x = (i * i + i) / 2 + j

هر دو فرمولی که نوشتید به ظاهر اشتباه است.
دقت کنید که i * i + i) / 2 + j) با i * i + i / 2 + j فرق دارد و یکی نیست، اگر پارانتز ها را حذف کنید، فقط مقدار i بر
2 تقسیم می شود که ممکن است حاصل یک اعشاری مثل 1.5 باشد. بایستی مجموع i * i و i بر 2 تقسیم شوند.
اینها صرفا فرمول ریاضی هستند و با کد شان فرقی ندارند، الگوریتم خاصی نیاز نیست که کد چند سطری برایشان
بنویسید.
 

sarav

New Member
از توضیحات متشکرم مساله را برایم باز کردید
اما این دو فرمول تنها برای ذخیره ماتریس در آرایه به صورت سطری بود
اگر می شود فرمول ستونی آن را هم بنویسید(یعنی به صورت ستونی در آرایه ذخیره شود )
 

the_king

مدیرکل انجمن
از توضیحات متشکرم مساله را برایم باز کردید
اما این دو فرمول تنها برای ذخیره ماتریس در آرایه به صورت سطری بود
اگر می شود فرمول ستونی آن را هم بنویسید(یعنی به صورت ستونی در آرایه ذخیره شود )

خودتون اگه یکم روی مساله فکر کنین می بینین که نیازی نیست فرمول های شیوه ستونی رو بپرسین،
پاسخ رو همین الان هم دارین، فقط کافیه یه ذره خلاقیت به خرج بدین.

این همون ماتریس بالا مثلثی قبلیه :
o9k7gn4qv9xoit7xpqkm.gif


وقتی محتویات این ماتریس بالا مثلثی رو به صورت ستونی در آرایه یک بعدی بنویسید، این طوری میشه :
8chcuucj04tf0y2em8.gif


به ظاهر الان نوشتن فرمولش کمی مشکل شده، اما اگه توی ماتریس جای سطر و ستون رو عوض کنین...
bzq50rul9d7iw7aseoe.gif


می بینید که به شیوه سطری همونی است که می خواهید اما به یک ماتریس پایین مثلثی تبدیل شده.
پس جواب فرمول ماتریس پایین مثلثی (برای شیوه سطری) است، با این تفاوت که جای i و j عوض میشه :

x = (j * j + j) / 2 + i

حالا بریم سراغ ماتریس پایین مثلثی :
17l38w9xklto1kyk9dse.gif


وقتی محتویات این ماتریس پایین مثلثی رو به صورت ستونی در آرایه یک بعدی بنویسید، این طوری میشه :
j29lqm62wo0pkofl9v73.gif


به ظاهر الان نوشتن فرمولش کمی مشکل شده، اما اگه توی ماتریس جای سطر و ستون رو عوض کنین...
5hih79isr82ir6djpqyc.gif


می بینید که به شیوه سطری همونی است که می خواهید اما به یک ماتریس بالا مثلثی تبدیل شده.
پس جواب فرمول ماتریس بالا مثلثی (برای شیوه سطری) است، با این تفاوت که جای i و j عوض میشه :

x = j * n - (j * j - j) / 2 + i - j
 

javaweb

Member
حالا شما بایستی فرمولی را بنویسید که شماره خانه در آرایه یک بعدی را از روی مقادیر سطر i و ستون j و
ابعاد ماتریس n بدست بیاورد، یعنی شما مقادیر i و j و n را به عنوان معلوم دارید و بایستی مجهول x را بدست بیاورید.

x = i * n - (i * i - i) / 2 + j - i
با سلام دوست عزیز اگر یک ماتریس بالا مثلثی داشته باشیم (4*4) به شکل زیر
a14a13a12a11
a24a23a220
a34a3300
a44000
خوب این ماتریس به شکل زیر در یک آرایه ی یک بعدی ذخیره می شود
a44a34a33a24a23a22a14a13a12a11
اگر بخواهیم شماره ی خانه ی a13 را بدست آوریم که i=1 و j=3 و n=4 پس داریم
x = i * n - (i * i - i) / 2 + j - i
x=1*4-(1*1+1)/2+3-1
پس x می شود 5
ولی خانه ی a13 در آرایه در خانه ی سوم است
مشکل کجاست؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
اگر کمک کنید ممنون می شم:rose:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
با سلام دوست عزیز اگر یک ماتریس بالا مثلثی داشته باشیم (4*4) به شکل زیر
a14a13a12a11
a24a23a220
a34a3300
a44000
خوب این ماتریس به شکل زیر در یک آرایه ی یک بعدی ذخیره می شود
a44a34a33a24a23a22a14a13a12a11
اگر بخواهیم شماره ی خانه ی a13 را بدست آوریم که i=1 و j=3 و n=4 پس داریم
x = i * n - (i * i - i) / 2 + j - i
x=1*4-(1*1+1)/2+3-1
پس x می شود 5
ولی خانه ی a13 در آرایه در خانه ی سوم است
مشکل کجاست؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
اگر کمک کنید ممنون می شم:rose:

اون فرمول برای زبان های C++ / C طراحی شده و مطابق ساختار این زبان ها، اندیس ها رو هم برای i و هم j و هم x از 0 شروع می کنه، نه 1
شما اگه برای محاسبه اندیس خانه ی a13 ، از i = 0 و j = 2 استفاده کنید، x میشه 2 که چون اندیس ها از 0 شروع میشه، 2 اندیس خونه سوم آرایه است.

فرمول برای اندیس های که از 1 شروع می شوند اینه :
کد:
x = j - (i - 1) * (i - 2 * n) / 2
 

the_king

مدیرکل انجمن
با تشکر دوست از شما دوست عزیز
اگر ممکنه روش بدست آوردن این فرمول را هم بگید یا فرمول قبل از ساده شدن:green:
با تشکر
ببینید با قرار گرفتن هر سطر از ماتریس در آرایه، چند خونه به آرایه اضافه میشه؟
از سطر اول ماتریس n خونه در آرایه قرار می گیره، از سطر دوم ماتریس n - 1 خونه، و از سطر سوم ماتریس n - 2 خونه و ...
پس اگه i سطر ابتدای ماتریس (از سطر 1 الی i) در آرایه قرار بگیره، در مجموع اینقدر خونه در آرایه قرار گرفته :
کد:
(n - 0) + (n - 1) + (n - 2) +  (n - 3) + ... + (n - i - 1)
که معادل این است :
کد:
n + n + n + n + ... + n - (0 + 1 + 2 + 3 + ... + (i - 1))
که بر اساس سری های ریاضی فرمول اش میشه :
کد:
i * n - i * (i - 1) / 2
فرمول بالا مشخص می کنه که [A[n خونه چندم آرایه است، چون [A[n آخرین عضو سطر i ام ئه و وقتی در آرایه قرار گرفت همه سطر های 1 الی i در آرایه قرار گرفته.
اگه [A[j در آرایه قرار گرفته باشه، موقعیت اش در آرایه n - j خونه عقب تر از [A[n است، پس اگه از فرمول بالا n - j رو کم کنیم، موقعیت خونه [A[j مشخص میشه :
کد:
i * n - i * (i - 1) / 2 - (n - j)
که خلاصه اش می کنیم :
کد:
= i * n - i * (i - 1) / 2 - n + j
= j - i * (i - 1) / 2 + i * n - n
= j - (i - 1) * i / 2 + i * n - n
= j - (i - 1) * i / 2 + (i - 1) * n
= j - (i - 1) * (i / 2 - n)
= j - (i - 1) * (i - 2 * n) / 2
 

kosariiiii

New Member
با سلام به دوست عزیز
من فرمول تبدیل اندیس های ماتریس بالا مثلثی و یا پایین مثلثی را در یک ارایه های یک بعدی را میخواستم .
هر چقدم گشتم به جواب سوالم نرسیدم اگه امکانش هست میتونید راهنمایی بکنید ممنون
 

جدیدترین ارسال ها

بالا