Специальные виды матриц. Пример


Работа с матрицами как с двумерными массивами не представляет никаких проблем. Вместе с тем, имеется целый ряд матриц особого рода, работа с которыми требует особого подхода. Это матрицы, в которых большинство элементов имеют одинаковые значения, - обычно равные нулю:

· треугольные матрицы, у которых 0-е элементы расположены над главной диагональю,

· ленточные матрицы ширины d >0, у которых все элементы aij, для которых abs(i-j) > d имеют одинаковые 0-е значения,

· зазреженные матрицы, у которых большинство элементов равны 0.

Для треугольных и ленточных матриц обычно используется последовательное сжатое представление. 0-й элемент не заносится в матрицу, а все остальные элементы располагаются подряд, в виде вектора.

Пример

Пусть задана треугольная матрица вида:

     
     
     

В памяти ЭВМ представление матрицы будет следующим:

           

 

Т.о., для хранения элементов требуется n * (n + 1) / 2 ячеек вместо n2. Индекс для доступа к aij–у элементу рассчитывается по формуле:

(i + 1) * i / 2 + j.

Не составляет труда специфицировать функцию для чтения ij-го элемента матрицы:

double getEl(double *p, int n, int i, int j, int *k)

{

if((i > n)||(j > n))

{

*k = -1; // выход за пределы изменения индексов

return 0.0;

}

if(j > i)

{

*k = 0; // признак корректного результата

return 0.0;

}

*k = 0; // признак корректного результата

return p[(i+1)*i/2+j];

}

 

Пример

Пусть задана следующая ленточная матрица с d=1:

         
         
         
         
         

 

Представление матрицы в виде вектора будет следующим:

                         

 

Индекс для доступа к aij–у элементу рассчитывается по формуле:

i * (2*d +1) + j – i = i * 2 * d + j.

 

Разреженные матрицы могут быть представлены различными способами. Укажем 2 из них:

· последовательное сжатое представление,

· последовательное-связанное индексное сжатое представление.

 

В первом случае элементы матрицы за исключением 0-х размещают в линейном списке. Каждый элемент представлен тройками вида <i, j, aij>. Поиск ij-го элемента выполняется на основе последовательного просмотра всех элементов списка и сравнения первых двух элементов на соответствие заданным индексам.

Во втором случае, если размерность матрицы n x n, то ее представляют в виде n-списков и каждый элемент представлен тройкой:

<индекс столбца, значение элемента, ссылка на следующий элемент той же строки>.

 

Вопросы для самоконтроля

  • Как указать компилятору, что указатель p типа void * ссылается в текущей точке программы на данные типа unsigned long?
  • Что выполняют операции * и &?
  • Какие операции применимы к указателям?
  • Можно ли к указателям применить операции автоинкремента и автодекремента?
  • Чем отличаются декларации char *p[10] и char (*p)[10]?
  • В каком виде можно представить треугольные, ленточные и разреженные матрицы?
  • Как записать в выражении обращение к элементу массива a[i][j], с помощью указателя p, если имеем в программе следующие декларации:

int i, j;

float a[N][M]; // N и M - константы

float *p = a; ?

 



Дата добавления: 2016-05-26; просмотров: 2671;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.