Пример #1
0
void exp_real_array(const real_array_t * a, modelica_integer n, real_array_t* dest)
{
    modelica_integer i;

    /* Assert n>=0 */
    /* Assert a matrix */
    /* Assert square matrix */

    if (n==0) {
        identity_real_array(a->dim_size[0],dest);
    } else {
        if (n==1) {
            clone_real_array_spec(a,dest);
            copy_real_array_data(a,dest);
        } else {
            real_array_t* tmp = 0;
            clone_real_array_spec(a,tmp);
            copy_real_array_data(a,tmp);
            for (i = 1; i < n; ++i) {
                mul_real_matrix_product(a,tmp,dest);
                copy_real_array_data(dest,tmp);
            }
        }
    }
}
Пример #2
0
/* function: transpose_real_array
 *
 * Implementation of transpose(A) for matrix A.
 */
void transpose_real_array(const real_array_t * a, real_array_t* dest)
{
    size_t i;
    size_t j;
    /*  size_t k;*/
    size_t n,m;

    if (a->ndims == 1) {
        copy_real_array_data(a,dest);
        return;
    }

    assert(a->ndims==2 && dest->ndims==2);

    n = a->dim_size[0];
    m = a->dim_size[1];

    assert(dest->dim_size[0] == m && dest->dim_size[1] == n);

    for (i = 0; i < n; ++i) {
        for (j = 0; j < m; ++j) {
            real_set(dest, (j * n) + i, real_get(a, (i * m) + j));
        }
    }
}
Пример #3
0
void exp_real_array(const real_array_t * a, modelica_integer n, real_array_t* dest)
{
    /* Assert n>=0 */
    omc_assert_macro(n >= 0);
    /* Assert that a is a two dimensional square array */
    omc_assert_macro((a->ndims == 2) && (a->dim_size[0] == a->dim_size[1]));
    /* Assert that dest is a two dimensional square array with the same size as a */
    omc_assert_macro((dest->ndims == 2) && (dest->dim_size[0] == dest->dim_size[1]) && (a->dim_size[0] == dest->dim_size[0]));

    if(n==0) {
        identity_real_array(a->dim_size[0],dest);
    } else {
        if(n==1) {
            clone_real_array_spec(a,dest);
            copy_real_array_data(*a,dest);
        } else if (n==2) {
            clone_real_array_spec(a,dest);
            mul_real_matrix_product(a,a,dest);
        } else {
            modelica_integer i;

            real_array_t tmp;
            real_array_t * b;
            real_array_t * c;

            /* prepare temporary array */
            clone_real_array_spec(a,&tmp);
            clone_real_array_spec(a,dest);

            if ((n&1) != 0) {
              b = &tmp;
              c = dest;
            } else {
              b = dest;
              c = &tmp;
            }
            mul_real_matrix_product(a,a,b);
            for( i = 2; i < n; ++i) {
                real_array_t * x;

                mul_real_matrix_product(a,b,c);

                /* exchange b and c */
                x = b;
                b = c;
                c = x;
            }
            /* result is already in dest */
        }
    }
}
Пример #4
0
void copy_real_array(const real_array_t *source, real_array_t *dest)
{
    clone_base_array_spec(source, dest);
    alloc_real_array_data(dest);
    copy_real_array_data(source,dest);
}