Здравствуйте, вопрос по стилю программирования в Математике.
Задача: Посчитать "гистограммную характеристику" неких свойств объекта.
Объект состоит из множества точек плоскости, с целочисельными координатами.
Позиция в гистограмме и интегральная характеристика, обновляемая в этой позиции формализуются отдельно.
Моё решение:
Код:
(* Вычисление позиции в гистограмме, обновление для одной точки *)
PointUpdateResult[res_, x_, y_, n_] := Block[ {offset = MyOffset[x, y, n] (* позиция в гистограмме *)},
++res[[offset,1]]; (* количество *)
res[[offset,2]] += Sqrt[x^2 + y^2]; (* "интегральное свойство" *)
];
SetAttributes[PointUpdateResult, {HoldFirst}];
(* итерация по точкам, накопление необходимого свойства *)
UpdateResult[res, x_, y_, w_, Order_] := For[cr=0, cr<Order, ++cr;
PointUpdateResult[res, x+cr, y, Order] ];
SetAttributes[UpdateResult, {HoldFirst}];
(* функция, работающая с самим объектом *)
SectorFeatures[x_, Order_]:= Block[ { params=Runs[x], second_params = Mec[x], res=Table[{0,0},Order] (* "выделяем память" под гистограмму *)},
UpdateResult[res,second_params,Order,#] & /@ params;
res // MatrixForm
];
Таким образом, пришлось организовывать "передачу параметра по ссылке" для организации циклического накопления нужного мне свойства.
Возможно существуют другие приёмы итерирования, позволяющие решить задачу проще?
Или же какие-то пропущенные мной способы организации map-подобного контейнера (из C++, хранилище пар <уникальный_ключ, значение>)?