Текст подпрограммы и версий
amtsr_c.zip , amtsd_c.zip
Тексты тестовых примеров
tamtsr_c.zip , tamtsd_c.zip

Подпрограмма:  amtsr_c

Назначение

Транспонирование прямоугольной разреженной матрицы, заданной в формате RR (C) U

Математическое описание

Рассмотрим сначала формат RR (C) O.

Рассмотрим сначала формат RR (C) O.

Сокращенное название данного формата происходит от английского словосочетания "Row - wise Representation Complete and Ordered" (строчное представление, полное и упорядоченное).

Значения ненулевых элементов матрицы и соответствующие им столбцовые индексы хранятся в этом формате по строкам в двух массивах AN и JA. Используется также массив указателей IA, указывающих компоненты массивов AN и JA, с которых начинается описание очередной строки. Последняя компонента массива IA содержит указатель первой свободной компоненты в массивах AN и JA, т.е. равна числу ненулевых элементов матрицы, увеличенному на единицу. Поясним сказанное на примере.

Рассмотрим матрицу A с тремя строками и десятью столбцами:

                     1     2    3     4      5      6      7      8      9    10 

              1    | 0    0   1.0   3.0   0      0      0     5.0    0     0   |
      A =  2    | 0    0    0     0      0      0      0      0      0     0   |
              3    | 0    0    0     0      0     7.0    0     1.0    0     0   |

В формате RR (C) O матрица A представляется следующим образом:

             IA  =  (1, 4, 4;   6) 
             JA  =  (3, 4, 8;   6,8) 
           AN  =  (1.0, 3.0, 5.0;   7.0, 1.0) 

Значения ненулевых элементов первой строки матрицы A и их столбцовых индексов начинаются с компонент массивов AN и JA, номера которых определяются первой компонентой массива IA. В данном примере - с первых компонент массивов AN и JA, поскольку IA (1) = 1.

Информация о второй строке матрицы A указывается в массивах AN и JA с компонент, номера которых определяются второй компонентой массива IA, т.е. с компонент с номером 4, поскольку IA (2) = 4. Аналогично, третья строка матрицы A определяется компонентами массивов AN и JA начиная с AN(4) и JA(4), поскольку IA (3) = 4. Заметим, что IA (2) = IA (3) = 4, а это означает, что вторая строка матрицы A нулевая.

Последняя, четвертая компонента массива IA, равная 6 (IA (4) = 6)), указывает номер первой свободной компоненты массивов AN и JA, начиная с которой информация о матрице A отсутствует. Это означает, что описание последней, третьей строки матрицы A заканчивается в компонентах с номером IA (4) - 1 = 5 массивов AN и JA.

В общем случае описание r - й строки матрицы A хранится в компонентах с IA (r) до IA (r + 1) - 1 массивов AN и JA. Если IA (r + 1) = IA(r), то это означает, что  r - я строка нулевая. Если матрица A имеет  m строк, то массив IA состоит из (m + 1) - й компоненты.

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

Говорят, что массивы IA и JA представляют портрет (структуру) матрицы A. Если алгоритм, реализующий какую - либо операцию над разреженными матрицами, разбит на этапы символической обработки, на котором определяется портрет результирующей матрицы, и численной обработки, на котором определяются численные значения элементов результирующей матрицы, то массивы IA и JA заполняются на первом этапе, а массив AN - на втором.

Рассмотрим теперь формат RR (C) U.

Сокращенное название данного формата происходит от английского словосочетания "Row - wise Representation Complete and Unordered" (строчное представление, полное, но неупорядоченное).

Формат RR (C) U вводится по следующим причинам. Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк соблюдается, внутри каждой строки элементы исходных матриц могут храниться в произвольном порядке. Такие неупорядоченные представления могут быть весьма удобны в практических вычислениях. Результаты большинства матричных операций получаются неупорядоченными, а их упорядочение стоило бы значительных затрат машинного времени. В то же время, за немногими исключениями, алгоритмы для разреженных матриц не требуют, чтобы их представления были упорядоченными. Для приведенной выше матрицы A, например, ее представление в формате RR(C)U может иметь вид:

             IA  =  (1, 4, 4;   6) 
             JA  =  (8, 3, 4;   8,6)
           AN  =  (5.0, 1.0, 3.0;   1.0,7.0) 

После работы подпрограммы amtsr_c результирующая транспонированная матрица A представляется в формате RR (C) O.

С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1988

Использование

    int amtsr_c (integer *ia, integer *ja, real *an, integer *n,
            integer *m, integer *iat, integer *jat, real *ant)

Параметры

ia - целый массив длины n + 1, содержащий указатели компонент массивов ja и an, с которых начинается описание очередной строки транспонируемой матрицы; последняя компонента массива ia содержит число ненулевых элементов, увеличенное на единицу;
ja - целый массив, содержащий не обязательно в упорядоченном виде номера столбцов ненулевых элементов транспонируемой матрицы по ее строкам, начиная с первой; его длина равна числу ненулевых элементов;
an - вещественный массив, содержащий ненулевые элементы транспонируемой матрицы по строкам в соответствии с массивом ja; длина an равна числу ненулевых элементов;
n - заданное число строк транспонируемой матрицы (тип: целый);
m - заданное число столбцов транспонируемой матрицы (тип: целый);
iat - целый массив длины m + 1, содержащий указатели компонент массивов jat и ant, с которых начинается описание очередной строки транспонированной матрицы; последняя компонента массива iat содержит число ненулевых элементов, увеличенное на единицу;
jat - целый массив, содержащий в упорядоченном виде номера столбцов ненулевых элементов транспонированной матрицы по ее строкам, начиная с первой; его длина равна числу ненулевых элементов;
ant - вещественный массив, содержащий ненулевые элементы транспонированной матрицы по строкам в соответствии с массивом jat; длина ant равна числу ненулевых элементов

Версии

amtsd_c - транспонирование прямоугольной разреженной матрицы, заданной в формате RR (C) U, в режиме удвоенной точности; при этом параметры an и ant должны иметь тип double

Вызываемые подпрограммы: нет

Замечания по использованию: нет

Пример использования

int main(void)
{
    /* Initialized data */
    static int ia[6] = { 1,4,6,8,11,14 };
    static int ja[13] = { 5,6,3,4,1,3,4,4,3,1,2,6,5 };
    static float an[13] = { 15.f,16.f,13.f,24.f,21.f,33.f,34.f,44.f,43.f,
                            41.f,52.f,56.f,55.f };
    /* Local variables */
    static int m, n;
    extern int amtsr_c(int *, int *, float *, int *, int *, int *,
                       int *, float *);
    static int iat[7], jat[13];
    static float ant[13];

    n = 5;
    m = 6;
    amtsr_c(ia, ja, an, &n, &m, iat, jat, ant);

    printf("\n %5i %5i %5i %5i %5i %5i %5i \n",
           iat[0], iat[1], iat[2], iat[3], iat[4], iat[5], iat[6]);
    printf("\n %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i %5i \n",
           jat[0], jat[1], jat[2], jat[3], jat[4], jat[5], jat[6],
           jat[7], jat[8], jat[9], jat[10], jat[11], jat[12]);
    printf("\n %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f \n",
           ant[0], ant[1], ant[2], ant[3], ant[4], ant[5], ant[6]);
    printf("\n %5.1f %5.1f %5.1f %5.1f %5.1f %5.1f \n",
           ant[7], ant[8], ant[9], ant[10], ant[11], ant[12]);
    return 0;
} /* main */


Результаты: 
                
        iat  =  (1, 3, 4, 7, 10, 12, 14) 
        jat  =  (2, 4, 5, 1, 3, 4, 2, 3, 4, 1, 5, 1, 5) 
      ant  =  (21, 41, 52, 13, 33, 43, 24, 34, 44, 15, 55, 16, 56)