Content

Lösungsvorschlag

Zu beachten ist, dass die Länge der Diagonale gerade \(\text{min}(m,n)\) ist. Das wird in der zweiten Version mit

int mn = (DIM_M>DIM_N) ? DIM_N : DIM_M;

berücksichtigt.

Version 1

int
printf(const char *, ...);

void
initGeMatrix(int m, int n, double *A, int incRowA, int incColA)
{
    int i, j;

    for (i=0; i<m; ++i) {
        for (j=0; j<n; ++j) {
            A[i*incRowA+j*incColA] = i*n + j + 1;
        }
    }
}

void
printGeMatrix(int m, int n, const double *A, int incRowA, int incColA)
{
    int i, j;

    for (i=0; i<m; ++i) {
        for (j=0; j<n; ++j) {
            printf("%10.4lf ", A[i*incRowA+j*incColA]);
        }
        printf("\n");
    }
    printf("\n\n");
}

#ifndef DIM_M
#define DIM_M 6
#endif

#ifndef DIM_N
#define DIM_N 8
#endif

#ifndef ROWMAJOR
#define ROWMAJOR 0
#endif

#if (ROWMAJOR==1)
#   define INCROW_A  DIM_N
#   define INCCOL_A  1
#else
#   define INCROW_A  1
#   define INCCOL_A  DIM_M
#endif

double A[DIM_M*DIM_N];

int
main()
{
    initGeMatrix(DIM_M, DIM_N, A, INCROW_A, INCCOL_A);

    printf("A =\n");
    printGeMatrix(DIM_M, DIM_N, A, INCROW_A, INCCOL_A);

    printf("A^T =\n");
    printGeMatrix(DIM_N, DIM_M, A, INCCOL_A, INCROW_A);

    printf("diag(A) =\n");
    printGeMatrix(DIM_M, 1, A, INCROW_A+INCCOL_A, INCCOL_A);

    return 0;
}

Konfiguration 1

$shell> gcc -Wall -DDIM_M=6 -DDIM_N=8 -DROWMAJOR=0 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000     7.0000     8.0000 
    9.0000    10.0000    11.0000    12.0000    13.0000    14.0000    15.0000    16.0000 
   17.0000    18.0000    19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000    31.0000    32.0000 
   33.0000    34.0000    35.0000    36.0000    37.0000    38.0000    39.0000    40.0000 
   41.0000    42.0000    43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     9.0000    17.0000    25.0000    33.0000    41.0000 
    2.0000    10.0000    18.0000    26.0000    34.0000    42.0000 
    3.0000    11.0000    19.0000    27.0000    35.0000    43.0000 
    4.0000    12.0000    20.0000    28.0000    36.0000    44.0000 
    5.0000    13.0000    21.0000    29.0000    37.0000    45.0000 
    6.0000    14.0000    22.0000    30.0000    38.0000    46.0000 
    7.0000    15.0000    23.0000    31.0000    39.0000    47.0000 
    8.0000    16.0000    24.0000    32.0000    40.0000    48.0000 


diag(A) =
    1.0000 
   10.0000 
   19.0000 
   28.0000 
   37.0000 
   46.0000 
$shell> 

Konfiguration 2

$shell> gcc -Wall -DDIM_M=6 -DDIM_N=8 -DROWMAJOR=1 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000     7.0000     8.0000 
    9.0000    10.0000    11.0000    12.0000    13.0000    14.0000    15.0000    16.0000 
   17.0000    18.0000    19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000    31.0000    32.0000 
   33.0000    34.0000    35.0000    36.0000    37.0000    38.0000    39.0000    40.0000 
   41.0000    42.0000    43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     9.0000    17.0000    25.0000    33.0000    41.0000 
    2.0000    10.0000    18.0000    26.0000    34.0000    42.0000 
    3.0000    11.0000    19.0000    27.0000    35.0000    43.0000 
    4.0000    12.0000    20.0000    28.0000    36.0000    44.0000 
    5.0000    13.0000    21.0000    29.0000    37.0000    45.0000 
    6.0000    14.0000    22.0000    30.0000    38.0000    46.0000 
    7.0000    15.0000    23.0000    31.0000    39.0000    47.0000 
    8.0000    16.0000    24.0000    32.0000    40.0000    48.0000 


diag(A) =
    1.0000 
   10.0000 
   19.0000 
   28.0000 
   37.0000 
   46.0000 
$shell> 

Konfiguration 3

$shell> gcc -Wall -DDIM_M=8 -DDIM_N=6 -DROWMAJOR=0 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000 
    7.0000     8.0000     9.0000    10.0000    11.0000    12.0000 
   13.0000    14.0000    15.0000    16.0000    17.0000    18.0000 
   19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000 
   31.0000    32.0000    33.0000    34.0000    35.0000    36.0000 
   37.0000    38.0000    39.0000    40.0000    41.0000    42.0000 
   43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     7.0000    13.0000    19.0000    25.0000    31.0000    37.0000    43.0000 
    2.0000     8.0000    14.0000    20.0000    26.0000    32.0000    38.0000    44.0000 
    3.0000     9.0000    15.0000    21.0000    27.0000    33.0000    39.0000    45.0000 
    4.0000    10.0000    16.0000    22.0000    28.0000    34.0000    40.0000    46.0000 
    5.0000    11.0000    17.0000    23.0000    29.0000    35.0000    41.0000    47.0000 
    6.0000    12.0000    18.0000    24.0000    30.0000    36.0000    42.0000    48.0000 


diag(A) =
    1.0000 
    8.0000 
   15.0000 
   22.0000 
   29.0000 
   36.0000 
    0.0000 
    0.0000 
$shell> 

Konfiguration 4

$shell> gcc -Wall -DDIM_M=8 -DDIM_N=6 -DROWMAJOR=1 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000 
    7.0000     8.0000     9.0000    10.0000    11.0000    12.0000 
   13.0000    14.0000    15.0000    16.0000    17.0000    18.0000 
   19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000 
   31.0000    32.0000    33.0000    34.0000    35.0000    36.0000 
   37.0000    38.0000    39.0000    40.0000    41.0000    42.0000 
   43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     7.0000    13.0000    19.0000    25.0000    31.0000    37.0000    43.0000 
    2.0000     8.0000    14.0000    20.0000    26.0000    32.0000    38.0000    44.0000 
    3.0000     9.0000    15.0000    21.0000    27.0000    33.0000    39.0000    45.0000 
    4.0000    10.0000    16.0000    22.0000    28.0000    34.0000    40.0000    46.0000 
    5.0000    11.0000    17.0000    23.0000    29.0000    35.0000    41.0000    47.0000 
    6.0000    12.0000    18.0000    24.0000    30.0000    36.0000    42.0000    48.0000 


diag(A) =
    1.0000 
    8.0000 
   15.0000 
   22.0000 
   29.0000 
   36.0000 
   43.0000 
    0.0000 
$shell> 

Version 2

int
printf(const char *, ...);

void
initGeMatrix(int m, int n, double *A, int incRowA, int incColA)
{
    int i, j;

    for (i=0; i<m; ++i) {
        for (j=0; j<n; ++j) {
            A[i*incRowA+j*incColA] = i*n + j + 1;
        }
    }
}

void
printGeMatrix(int m, int n, const double *A, int incRowA, int incColA)
{
    int i, j;

    for (i=0; i<m; ++i) {
        for (j=0; j<n; ++j) {
            printf("%10.4lf ", A[i*incRowA+j*incColA]);
        }
        printf("\n");
    }
    printf("\n\n");
}

#ifndef DIM_M
#define DIM_M 6
#endif

#ifndef DIM_N
#define DIM_N 8
#endif

#ifndef ROWMAJOR
#define ROWMAJOR 0
#endif

#if (ROWMAJOR==1)
#   define INCROW_A  DIM_N
#   define INCCOL_A  1
#else
#   define INCROW_A  1
#   define INCCOL_A  DIM_M
#endif

double A[DIM_M*DIM_N];

int
main()
{
    initGeMatrix(DIM_M, DIM_N, A, INCROW_A, INCCOL_A);

    printf("A =\n");
    printGeMatrix(DIM_M, DIM_N, A, INCROW_A, INCCOL_A);

    printf("A^T =\n");
    printGeMatrix(DIM_N, DIM_M, A, INCCOL_A, INCROW_A);

    int mn = (DIM_M>DIM_N) ? DIM_N : DIM_M;

    printf("diag(A) =\n");
    printGeMatrix(mn, 1, A, INCROW_A+INCCOL_A, INCCOL_A);

    return 0;
}

Konfiguration 1

$shell> gcc -Wall -DDIM_M=6 -DDIM_N=8 -DROWMAJOR=0 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000     7.0000     8.0000 
    9.0000    10.0000    11.0000    12.0000    13.0000    14.0000    15.0000    16.0000 
   17.0000    18.0000    19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000    31.0000    32.0000 
   33.0000    34.0000    35.0000    36.0000    37.0000    38.0000    39.0000    40.0000 
   41.0000    42.0000    43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     9.0000    17.0000    25.0000    33.0000    41.0000 
    2.0000    10.0000    18.0000    26.0000    34.0000    42.0000 
    3.0000    11.0000    19.0000    27.0000    35.0000    43.0000 
    4.0000    12.0000    20.0000    28.0000    36.0000    44.0000 
    5.0000    13.0000    21.0000    29.0000    37.0000    45.0000 
    6.0000    14.0000    22.0000    30.0000    38.0000    46.0000 
    7.0000    15.0000    23.0000    31.0000    39.0000    47.0000 
    8.0000    16.0000    24.0000    32.0000    40.0000    48.0000 


diag(A) =
    1.0000 
   10.0000 
   19.0000 
   28.0000 
   37.0000 
   46.0000 
$shell> 

Konfiguration 2

$shell> gcc -Wall -DDIM_M=6 -DDIM_N=8 -DROWMAJOR=1 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000     7.0000     8.0000 
    9.0000    10.0000    11.0000    12.0000    13.0000    14.0000    15.0000    16.0000 
   17.0000    18.0000    19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000    31.0000    32.0000 
   33.0000    34.0000    35.0000    36.0000    37.0000    38.0000    39.0000    40.0000 
   41.0000    42.0000    43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     9.0000    17.0000    25.0000    33.0000    41.0000 
    2.0000    10.0000    18.0000    26.0000    34.0000    42.0000 
    3.0000    11.0000    19.0000    27.0000    35.0000    43.0000 
    4.0000    12.0000    20.0000    28.0000    36.0000    44.0000 
    5.0000    13.0000    21.0000    29.0000    37.0000    45.0000 
    6.0000    14.0000    22.0000    30.0000    38.0000    46.0000 
    7.0000    15.0000    23.0000    31.0000    39.0000    47.0000 
    8.0000    16.0000    24.0000    32.0000    40.0000    48.0000 


diag(A) =
    1.0000 
   10.0000 
   19.0000 
   28.0000 
   37.0000 
   46.0000 
$shell> 

Konfiguration 3

$shell> gcc -Wall -DDIM_M=8 -DDIM_N=6 -DROWMAJOR=0 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000 
    7.0000     8.0000     9.0000    10.0000    11.0000    12.0000 
   13.0000    14.0000    15.0000    16.0000    17.0000    18.0000 
   19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000 
   31.0000    32.0000    33.0000    34.0000    35.0000    36.0000 
   37.0000    38.0000    39.0000    40.0000    41.0000    42.0000 
   43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     7.0000    13.0000    19.0000    25.0000    31.0000    37.0000    43.0000 
    2.0000     8.0000    14.0000    20.0000    26.0000    32.0000    38.0000    44.0000 
    3.0000     9.0000    15.0000    21.0000    27.0000    33.0000    39.0000    45.0000 
    4.0000    10.0000    16.0000    22.0000    28.0000    34.0000    40.0000    46.0000 
    5.0000    11.0000    17.0000    23.0000    29.0000    35.0000    41.0000    47.0000 
    6.0000    12.0000    18.0000    24.0000    30.0000    36.0000    42.0000    48.0000 


diag(A) =
    1.0000 
    8.0000 
   15.0000 
   22.0000 
   29.0000 
   36.0000 
$shell> 

Konfiguration 4

$shell> gcc -Wall -DDIM_M=8 -DDIM_N=6 -DROWMAJOR=1 -o initmatrix initmatrix.c
$shell> ./initmatrix
A =
    1.0000     2.0000     3.0000     4.0000     5.0000     6.0000 
    7.0000     8.0000     9.0000    10.0000    11.0000    12.0000 
   13.0000    14.0000    15.0000    16.0000    17.0000    18.0000 
   19.0000    20.0000    21.0000    22.0000    23.0000    24.0000 
   25.0000    26.0000    27.0000    28.0000    29.0000    30.0000 
   31.0000    32.0000    33.0000    34.0000    35.0000    36.0000 
   37.0000    38.0000    39.0000    40.0000    41.0000    42.0000 
   43.0000    44.0000    45.0000    46.0000    47.0000    48.0000 


A^T =
    1.0000     7.0000    13.0000    19.0000    25.0000    31.0000    37.0000    43.0000 
    2.0000     8.0000    14.0000    20.0000    26.0000    32.0000    38.0000    44.0000 
    3.0000     9.0000    15.0000    21.0000    27.0000    33.0000    39.0000    45.0000 
    4.0000    10.0000    16.0000    22.0000    28.0000    34.0000    40.0000    46.0000 
    5.0000    11.0000    17.0000    23.0000    29.0000    35.0000    41.0000    47.0000 
    6.0000    12.0000    18.0000    24.0000    30.0000    36.0000    42.0000    48.0000 


diag(A) =
    1.0000 
    8.0000 
   15.0000 
   22.0000 
   29.0000 
   36.0000 
$shell>