Текст подпрограммы и версий
ama8r_c.zip , ama8d_c.zip
Тексты тестовых примеров
tama8r_c.zip , tama8d_c.zip

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

Назначение

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

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

Описание формата RR (C) U приведено в описании подпрограммы amtsr_c .

Пусть заданы прямоугольные разреженные матрицы A и B размеров N на M в формате RR (C) U и портрет матрицы C, равной A + B, также в формате RR (C) U, который может быть получен подпрограммой ama7r_c на символическом этапе сложения. Подпрограмма ama8r_c по этим исходным данным вычисляет ненулевые элементы матрицы C

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

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

    int ama8r_c (integer *ia, integer *ja, real *an, integer *ib,
        integer *jb, real *bn, integer *n, integer *m, integer *ic,
        integer *jc, real *cn, real *x)

Параметры

   ia, ja -
      an  
заданные портрет и ненулевые элементы матрицы A в формате RR (C) U;
   ib, jb -
      bn  
заданные портрет и ненулевые элементы матрицы B в формате RR (C) U;
n - заданное число строк матриц A, B и C (тип: целый);
m - заданное число столбцов матриц A, B и C (тип: целый).
ic, jc - заданный портрет матрицы C = A + B в формате RR (C) U;
cn - вещественный одномерный массив, в котором формируются ненулевые элементы матрицы c согласно портрету  ic, jc;
x - вещественный массив длины m, используемый в подпрограмме в качестве рабочего

Версии:

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

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

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

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

int main(void)
{
    /* Initialized data */
    static int ia[5] = { 1,3,7,9,11 };
    static int ja[10] = { 5,3,4,3,1,5,1,6,4,2 };
    static int ib[5] = { 1,4,5,8,10 };
    static int jb[9] = { 1,6,3,5,4,2,1,2,3 };
    static int ic[5] = { 1,5,9,13,16 };
    static int jc[15] = { 5,3,1,6,4,3,1,5,1,6,4,2,4,2,3 };
    static float an[10] = { -1.f,2.f,3.f,3.f,4.f,7.f,-2.f,-1.f,1.f,1.f };
    static float bn[9] = { 1.f,5.f,-1.f,-2.f,2.f,6.f,4.f,-1.f,1.f };

    /* Local variables */
    extern int ama8r_c(int *, int *, float *, int *, int *, float *,
                       int *, int *, int *, int *, float *, float *);
    static int m, n, i__;
    static float x[6], cn[15];

    n = 4;
    m = 6;
    ama8r_c(ia, ja, an, ib, jb, bn, &n, &m, ic, jc, cn, x);

    for (i__ = 0; i__ <= 10; i__+= 5) {
         printf("\n  %4.0f %4.0f %4.0f %4.0f %4.0f \n",
                cn[i__], cn[i__+1], cn[i__+2], cn[i__+3], cn[i__+4]);
    }
    return 0;
} /* main */


Результаты:

      cn = ( - 1, 1, 1, 5, 3, 3, 4, 5, 2, - 1, 2, 6, 1, 0, 1 )