Writing to Arrays
Local arrays in ILNumerics can be modified after creation. The mutability is basically provided by only two member functions:
A.SetValue(value, indices)changes the value of a single element and expects a single system type as value. SetValue exposes ILNumericsV4 array style indexing semantics. Just like its counterpart GetValue(), SetValue()interacts with system types and is mostly useful for Array Import and Export. It is not further considered here. A.SetRange(value, range)allows the modification of arbitrary ranges of A. SetRange() fully supports all features of both: numpy arrays and ILNumericsV4 (including Matlab(R)-style) arrays.
In C# and all languages which support them, indexer offer a more convenient syntax for left side assignments.
Range Modification Options
Range Definition: All rules for Subarray Definitions apply for modification ranges as well. The range definition may include strings, constants, numeric variables and arrays, r([start],[end]) range definitions, stepped range defintions r([start],[step],[end]) and the keywords full and end. For an overview of all subarray options consult the Quick Start section!
Value Definition: The arrays containing the new values must match the size and shape defined by the range definition. The only exception is a scalar array. In that case, the value is assigned to all elements addressed by the range. The type of the value must match the element type of the destination array or an implicit conversion must exist. Note: most numeric system types implicitely convert to a double array.
Basic Modification Examples
The following examples demonstrate some basic array altering techniques. For simplicitiy reasons, we use the array indexer of C#. The same functionality could be achieved by utilizing the
If at least one of the indices from the range definition lays outside of the current array dimension limits, the array is resized automatically to match the range requested. New elements created that way receive the default value of the element type, for numeric arrays:
Changing the size of an array that way is a costly operation from a performance point of view. Frequent expanding modifications should be prevented by first creating an array large enough for all future changes and inserting new elements than. If one can not prevent from expanding an existing array, it is better to start inserting elements with the outermost element. That way, the array is expanded to the final size immediately.
Removing from Arrays
Parts of an array can be removed by assigning
Note, the last dimension is a singleton dimension now. It is not removed automatically.
Removals are triggered by assigning
Special Case: Remove by Sequential Indices
in strict correspondence to reshaping range definitions on read access, modifying an array by the specification of a single dimension only makes ILNumerics interprete the elements in the single range as sequential indices. This works as expected as long as the modification does only alter existing elements:
But as soon as we try to remove individual elements that way, we are out of luck. Removing the same element from the above example is only possible, when the array gets reshaped to a vector. Since ILNumerics by default creates column vectors (as for 'column major' storage), this is what we get: