(AISD)02 - Матрицы и многомерные массивы.ppt
- Количество слайдов: 22
Треугольные матрицы Матрица А называется треугольной, если все её элементы над главной диагональю имеют одинаковое значение v, т. е. для j > i элемент aij = v А= B= 1 2 4 7 1 0 3 5 8 2 0 0 6 9 3 4 0 0 0 10 5 6 7 8 9 10 Рисунок 2. 1. Последовательное сжатое хранение треугольной матрицы
Треугольные матрицы Для сжатого хранения треугольной матрицы А(nxn) в массиве В требуется n(n+1)/2 элементов массива, вместо n 2
Пример 2. 1 /* упаковывает квадратную треугольную матрицу Arr (над диагональю одинаковые значения, считаем что первая размерность - строки вторая размерность – столбцы) в одномерный массив B */ static int[] pack. Triangle(int[, ] Arr) { int ub , lb, k; //верхняя граница индекса ub = Arr. Get. Upper. Bound(0); //нижняя граница индекса lb = Arr. Get. Lower. Bound(0); //размер массива В вычисляем по формуле int[] B = new int [((ub - lb + 1) * (ub - lb + 2) / 2)]; k = 0; //текущий индекс массива В
Пример 2. 1 for(int i = lb; i<=ub; i++) //перебираем все строки for(int j = lb; j<=i; j++)//в { B[k] = Arr[i, j]; k++; } return B; } строке эл-ты до диагонального
Пример 2. 1 /* позволяет обращаться к упакованной матрице как к неупакованной. А - упакованная треугольная матрица i, j - координаты того элемента, значение которого нужно получить */ static int As. Triangle(int[] a, int i, int j) { if(i >= j) return a[i * (i + 1 ) / 2 + j ]; else return 0; }
Пример 2. 1 static void Main(string[] args) { /* c – одномерный массив с 4 элементами a – массив для сохранения результата умножения b – одномерный массив в котором содержится упакованная треугольная матрица an – исходная треугольная матрица */ int[] c = { 1, 2, 3, 4 }; int[] a = new int[4]; int[, ] an = { { 1, 0, 0, 0 }, { 2, 3, 0, 0 }, { 4, 5, 6, 0 }, { 7, 8, 9, 10 } }; int[] b; b = pack. Triangle(an);
Пример 2. 1 for (int i = 0; i < c. Length; i++) for (int j = 0; j < c. Length; j++) a[i] += As. Triangle(b, i, j) * c[j]; Output(an, "triangle"); Output(b, "pack"); Output(c, "с"); Output(a, "an*c"); }
Ленточные матрицы Матрица А называется ленточной ширины d, если все её элементы aij для которых , имеют одинаковое значение v. 1 3 0 0 0 А= B= 1 2 4 6 0 0 2 0 5 7 9 0 3 4 0 0 8 10 12 5 6 0 0 0 11 13 7 8 9 10 11 12 Рисунок 2. 2. Последовательное сжатое хранение ленточной матрицы 13
Ленточные матрицы Для сжатого хранения ленточной матрицы А(nxn) в массиве В требуется n(2 d+1)-2 d элементов массива, вместо n 2.
Разреженные матрицы А= 1 0 0 0 0 2 0 0 6 0 0 0 5 0 9 0 12 0 0 0 3 0 Рисунок 2. 3. Разреженная матрица I= 1 1 2 3 4 4 5 J= 1 4 3 4 2 5 4 B= 1 5 6 9 2 3 12 Рисунок 2. 4. Сжатое последовательное хранение разреженной матрицы
Пример 2. 2 /* упаковывает квадратную разреженную матрицу Arr (считаем что первая размерность - строки вторая размерность - столбцы)в матрицу B, первая строка которой содержит значения матрицы Аrr<>v вторая строка содержит номер строки этого элемента в Аrr третья строка содержит номер столбца этого элемента в Аrr v - значение тех элементов, которые не будут храниться. */ static int[, ] Pack. Sparse(int[, ] Arr, int v) {
Пример 2. 2 int ub, lb, k; ub = Arr. Get. Upper. Bound(0); индекса lb = Arr. Get. Lower. Bound(0); индекса //верхняя граница //нижняя граница int[, ] B = new int [3, 2*(ub-lb+1)]; k = 0; //количество элементов !=v
Пример 2. 2 for(int i = lb; i<=ub; i++) for(int j = lb; j<=ub; j++) if(Arr[i, j] != v) { B[0, k] = Arr[i, j]; B[1, k] = i; B[2, k] = j; k++; }
Пример 2. 2 int[, ] B 1 = new int [3, k]; for(int i=0; i
Пример 2. 2 static void Main(string[] args) { int[, ] an = { { 1, 0, 2, 0 }, { 0, -3, 0, 0 }, { 0, 0, 6, 0 }, { 0, 8, 0, 0 }}; int[, ] b; b = Pack. Sparse(an, 0); Output(an, "sparse"); Output(b, "pack"); }
Пример 2. 2
Двоичные матрицы А= 1 1 0 0 0 1 1 … В= 241 131 … Рисунок 2. 5. Хранение двоичного массива двоичными кодами. А= В= 1 1 0 0 0 1 1 … 4 3 2 5 2 … Рисунок 2. 6. Хранение двоичного массива длинами цепочек.
Пример 2. 3 /* упаковывает бинарный массив Arr (подразумевается, что его длина кратна 8) в массив B */ static byte[] Pack. Binary(byte[] Arr) { int ub, lb, k; ub = Arr. Get. Upper. Bound(0); индекса lb = Arr. Get. Lower. Bound(0); индекса //верхняя граница //нижняя граница byte[] B; B = new byte [(ub - lb + 1) / 8]; k = 0; массива В //текущий индекс
Пример 2. 3 for(int i = lb; i<=ub; i+=8) { B[k] = 0; for(int j = 0; j<=7; j++) if(Arr[i + j] == 1) B[k]+= Convert. To. Byte(Math. Pow(2, (7 - j))); k++; } return B; }
Пример 2. 3 static void Main(string[] args) { byte[] an = {1, 1, 0, 0, 0, 1, 1}; byte[] b; b = Pack. Binary(an); Output(an, "binary"); Output(b, "pack"); }
Пример 2. 3


