PDA

View Full Version : حرفه ای: ذخیره ماتریس پایین مثلثی به صورت ستونی در آرایه یک بعدی



mahdi-1
چهارشنبه 17 مهر 1392, 19:50 عصر
سلام
چه طور میشه ماتریس پایین مثلثی به صورت ستونی در آرایه یک بعدی ذخیره کرد یا حداقل فرمول بدست آوردن
محل ذخیره شدن در آرایه یک بعدی چیه؟

samin_panahi
چهارشنبه 17 مهر 1392, 20:35 عصر
سلام
می شه بیشتر توضیح بدید؟

pedram.11
چهارشنبه 17 مهر 1392, 20:37 عصر
سلام چون ماتریس های بالا مثلثی و پایین مثلثی ماتریس مربعی هستن تعداد سطر وستون رو با استفاده از طول آرایه ی یک بعدی(با جذر) میشه بدست آورد، حالا چون شما میخوای آرایه ی دوبعدی رو در آرایه ی یک بعدی ذخیره کنی میتونی با قانون خودت مثلا به ترتیب از سطر و ستون 1 و 1 تا سطر و ستون n و n رو در آرایه بریزی و موقع خوندن هم همین قانون رو رعایت کنی.

elderado
پنج شنبه 18 مهر 1392, 21:07 عصر
با سلام به شما دوست عزیز

شما می تونی اعداد ماتریس رو با ذکر شماره سطر و ستون اون ها توی آرایه ذخیره کنی. یعنی مقادیر توی خونه های آرایه به این صورت باشه:

عدد/شماره سطر/شماره ستون

اینجوری موقع بازخوانی اعداد می دونی جای هر کدوم از اعداد کجای ماتریس هست.
یا می تونی اعداد رو به ترتیب بریزی توی آرایه و بعد موقع فراخوانی با دوتا حلقه ی for تو در تو اونها رو سر جای خودشون توی ماتریس بذاری که این روش آسون تره.

مثلا یه ماتریس 3*3 :
0و0و1
0و1و2
1و3و4

آرایه: 2/2/1 - 4/3/1 - 3/3/2
همونجوی که میبینی موقع بازخوانی جای هر عدد مشخصه ، هرجا که شماره سطر و ستون برابر شد مقدارش میشه یک و هرجا که شماره سطر از شماره ستون کمتر بود مقدارش میشه صفر.
موفق باشی

FastCode
پنج شنبه 18 مهر 1392, 21:38 عصر
یا میتونی فقط یک طرف آرایه رو ذخیره کنی.البته اگر بدونی این فرمول چیه:
N=(L^2+L)/2
واقعا الان اعصاب حل کردن فرمول و نوشتنش رو ندارم ولی اگر خودت حوصلش رو داری با این فرمول میتونی حلش کنی.

shidaz
چهارشنبه 14 آبان 1393, 18:29 عصر
سلام
چطوری میشه بر عکس این کارو انجام داد؟؟؟
یعنی آرایه یک بعدی رو به ماتریس بالا مثلثی تبدیل کرد؟
:ناراحت:

pedram.11
چهارشنبه 14 آبان 1393, 20:31 عصر
سلام:
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);