سلام
چه طور میشه ماتریس پایین مثلثی به صورت ستونی در آرایه یک بعدی ذخیره کرد یا حداقل فرمول بدست آوردن
محل ذخیره شدن در آرایه یک بعدی چیه؟
سلام
چه طور میشه ماتریس پایین مثلثی به صورت ستونی در آرایه یک بعدی ذخیره کرد یا حداقل فرمول بدست آوردن
محل ذخیره شدن در آرایه یک بعدی چیه؟
سلام
می شه بیشتر توضیح بدید؟
سلام چون ماتریس های بالا مثلثی و پایین مثلثی ماتریس مربعی هستن تعداد سطر وستون رو با استفاده از طول آرایه ی یک بعدی(با جذر) میشه بدست آورد، حالا چون شما میخوای آرایه ی دوبعدی رو در آرایه ی یک بعدی ذخیره کنی میتونی با قانون خودت مثلا به ترتیب از سطر و ستون 1 و 1 تا سطر و ستون n و n رو در آرایه بریزی و موقع خوندن هم همین قانون رو رعایت کنی.
با سلام به شما دوست عزیز
شما می تونی اعداد ماتریس رو با ذکر شماره سطر و ستون اون ها توی آرایه ذخیره کنی. یعنی مقادیر توی خونه های آرایه به این صورت باشه:
عدد/شماره سطر/شماره ستون
اینجوری موقع بازخوانی اعداد می دونی جای هر کدوم از اعداد کجای ماتریس هست.
یا می تونی اعداد رو به ترتیب بریزی توی آرایه و بعد موقع فراخوانی با دوتا حلقه ی for تو در تو اونها رو سر جای خودشون توی ماتریس بذاری که این روش آسون تره.
مثلا یه ماتریس 3*3 :
0و0و1
0و1و2
1و3و4
آرایه: 2/2/1 - 4/3/1 - 3/3/2
همونجوی که میبینی موقع بازخوانی جای هر عدد مشخصه ، هرجا که شماره سطر و ستون برابر شد مقدارش میشه یک و هرجا که شماره سطر از شماره ستون کمتر بود مقدارش میشه صفر.
موفق باشی
یا میتونی فقط یک طرف آرایه رو ذخیره کنی.البته اگر بدونی این فرمول چیه:
N=(L^2+L)/2
واقعا الان اعصاب حل کردن فرمول و نوشتنش رو ندارم ولی اگر خودت حوصلش رو داری با این فرمول میتونی حلش کنی.
سلام
چطوری میشه بر عکس این کارو انجام داد؟؟؟
یعنی آرایه یک بعدی رو به ماتریس بالا مثلثی تبدیل کرد؟
سلام:
static int[] get1D(int[][] m)
{
int l0=m.GetLength(0);
int l = l0*(l0+1)/2;
int[] ar = new int[l];
int ind = 0;
for (int i = 0; i < l0; i++)
for (int j = 0; j <= i; j++)
ar[ind++] = m[i][j];
return ar;
}
static int[][] get2D(int[] m)
{
int l0 = m.Length;
int l = l0 * 2;
int rdelta = (int)Math.Sqrt(1 + 4 * l);
int r = (-1 + rdelta) / 2;
int[][] ar = new int[r][];
int ind=0;
for (int i = 0; i < r; i++)
{
ar[i] = new int[r];
for (int j = 0; j <= i; j++)
ar[i][j] = m[ind++];
}
return ar;
}
اولی ماتریس پایین مثلثی رو یک بعدی و دومی هم برعکسشو انجام میده.
واسه تست هم:
int[][] ar = {
new int[]{1,0,0,0,0},
new int[]{2,3,0,0,0},
new int[]{4,5,6,0,0},
new int[]{7,8,9,10,0},
new int[]{11,12,13,14,15}};
int[] x = get1D(ar);
int[][] x2 = get2D(x);