Additional Array Functions

In the previous tutorial we have seen that Arrays can be used in array expressions. This means that we can write the following.

    Array<double, 3> a(4., 5., 6.);
    Array<double, 3> b(2., 3., 4.);

    Array<double, 3> c;

    c = 2.*(a + b)/3.;

    c -= a;
    c *= 1.5;

You can multiply and divide arrays with numbers and add or subtract two arrays. Schnek uses expression templates for the evaluation. This means that the evaluation of an expression does not generate temporary objects. The evaluation of the expression will be as fast as writing the loop over all the elements in the vector yourself. Note however, that type promotion has not yet been implemented. This means that you can not write the following.

    c = 2*(a + b)/3; // compiler error

The difference here is that the number literals are of integer type, they don’t have a trailing decimal point. For now the numbers have to be of the same type as the value type of the array.

Arrays provide a number of additional functions, useful for everyday calculations. Here are some examples.

    Array<int, 3> a;

    a.fill(3);
    a.at(1) = 5;
    std::cout << "Product: " << a.product() << std::endl;
    std::cout << "Sum: " << a.sum() << std::endl;
    std::cout << "Square: " << a.sqr() << std::endl;

    Array<int,2> b = a.project<2>();
  • The method fill fills all elements in the array with a single value.
  • at is the accessor method and behaves exactly the same as the square bracket index operator.
  • The method product calculates the product of all the elements.
  • The method sum calculates the sum of all the elements.
  • The method sqr calculates the sum of squares of all the elements.
  • To convert a longer array to a shorter array, you can use the project method. Note that you have to explicitly specify the number of dimensions of the projected array.

The Array class also provides two static methods providing easy construction of the zero vector and an array filled with ones.

    Array<int, 3> zero = Array<int, 3>::Zero();
    Array<int, 3> ones = Array<int, 3>::Ones();

The code for these examples can be found as part of the Schnek package here.