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
fillfills all elements in the array with a single value. atis the accessor method and behaves exactly the same as the square bracket index operator.- The method
productcalculates the product of all the elements. - The method
sumcalculates the sum of all the elements. - The method
sqrcalculates the sum of squares of all the elements. - To convert a longer array to a shorter array, you can use the
projectmethod. 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.