In-place operations on subsets?


#1

I would like to perform a certain operation on every 2x2 non-overlapping subset of a very large 2D array with a single attribute. The operation updates the values of each element in the subset based on the current values of the other elements in that subset. For example, suppose I have:

a1 b1 | a2 b2
c1 d1 | c2 d2

a3 b3 | a4 b4
c3 d3 | c4 d4

The update operation would need to complete simple arithmetic operations on each element that would involve access to the other members of the subset (where i = 1, 2, 3 or 4).
ai = foo1(ai, bi, ci, di)
bi = foo2(bi, ci, di)
ci = foo3(ai, ci, di)
di = foo4(ai, bi, ci, di)

I am new to scidb and have implemented this in a way that involves (1) using thin to split a, b, c and d values into separate arrays, (2) performing the update on each array with select statements, and (3) reconstruction of the original grid layout via a convoluted process using xgrid and filter on each split array, and putting them together with some insert statements.

I would really like to perform the operation in place, or at least more efficiently, in a manner perhaps similar to using a user defined function aggregate operation (minus the aggregation) on non-overlapping chunks, but I don’t know how to do this or if implementing a UDF is even the correct line of thought.

Any help would be much appreciated :smile:


#2

Your best bet is probably to write a UDO (user-defined operator).

Alternatively, you might try to write 4 separate UDAs (user-defined aggregates), and use the SciDB windowing operators to traverse the array. This solution isn’t really in-place, though, and you would have to spend time to rebuild the array after processing it with the windowing query.