################# Binary operations ################# Binary operations between two objects can be handled in a variety of ways in Horace. You can either use the Matlab symbols +, - , \*, / and \\\, or you can use the explicit function names ``plus, minus, mtimes, mrdivide`` and ``mldivide``. There are several options for the input parameters to binary operations sqw objects ----------- Let us take for our example the addition operator '+', and our initial single sqw object is called ``w1`` and has the 'pix' array retained (note this is an important point - you can have an sqw object without the pix array by converting a dnd object to sqw. In that case the result is referred to as an sqw object of dnd type. In our example ``w1`` has a pix array, so is referred to as an sqw of sqw type). Single sqw object ================= You can add to w1 in the following way :: wout = w1 + w2_sqw wout = w1 + w2_sqw_dnd_type wout = w1 + w2_dnd wout = w1 + scalar The conditions for these operations are as follows: - ``w2_sqw`` is an sqw of sqw type, with a pix array of identical size to the pix array of ``w1``. There is only really one circumstance in which doing a binary operation of this type makes sense - when a background dataset has been created that maps exactly onto the real dataset, and needs to be subtracted. - ``w2_sqw_dnd_type`` is an sqw of dnd type (i.e. no it has pix array) whose plot axes overlap exactly with those of ``w1``. An example is taking a 1d cut along the energy axis from two different regions of reciprocal space, and then adding or subtracting one from the other. In this case the output will be a sqw object of dnd type, since the pixel information has lost its connection with the signal and error that are plottable. - ``w2_dnd`` as above, but ``w2_dnd`` is a dnd object rather than an sqw of dnd type. Similarly to the above, the output is an sqw object of dnd type. - ``scalar`` is a single number, e.g. if you want to add 4.782 to all of the data in ``w1``. The output stays as a full sqw of sqw type (with pix array). Array of sqw objects ==================== You can use the same binary operation syntax as for single sqw objects, with the following conditions - ``w2_sqw`` is either an array of sqw of sqw type objects with the pix array of each element matching the pix array of each element of ``w1``. Or a single sqw object if the pix array happens to be the same size for all elements of the ``w1`` array. - ``w2_sqw_dnd`` is as above, i.e. an array of dnd-type sqw objects whose plot axes match element by element those of the array ``w1``. - ``w2_dnd`` same rules as for sqw of dnd type above. - ``scalar`` the same scalar is subtracted from every pix array in the array of sqw objects. There is one additional possibility :: wout = w1 + numeric_array - ``numeric_array`` is an array of scalars whose size matches the size of the sqw array. The output will continue to be an sqw of sqw type, with a pix array. dnd objects ----------- Note that here we will use the phrase dnd object also to mean sqw object of dnd type, since the two are very closely related. Single dnd object ================= The choices for a dnd object are: :: wout = w1 + w2_sqw wout = w1 + w2_sqw_dnd_type wout = w1 + w2_dnd wout = w1 + scalar The forms of these objects are as described for the sqw case. In all cases the output will be a dnd object. Note that the pix field of ``w2_sqw`` is ignored for this operation. Array of dnd objects ==================== As with arrays of sqw objects, there is one further choice compared to a single dnd: :: wout = w1 + numeric_array As for sqw objects, the numeric array has to be the same size as the array of dnd objects. List of operations and their equivalent code -------------------------------------------- The arithmetic operations above correspond to equivalent Matlab functions. You should never need to use these, but for reference the corresponding functions are: :: w1 + w2 --> plus(w1,w2) w1 - w2 --> minus(w1,w2) w1 w2 --> mtimes(w1,w2) w1 / w2 --> mrdivide(w1,w2) w1 \\ w2 --> mldivide(w1,w2) w1 ^ w2 --> mpower(w1,w2) **Important** the matrix operations \*, /, \\\\ and ^ (mtimes, mrdivide, mldivide and mpower) are performed **element-by-element**. So the equivalent Matlab routines would be .*, ./, .\\\ and .^