2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Mathematica. Как сделать код "лучше"?
Сообщение07.08.2010, 23:15 
Здравствуйте, вопрос по стилю программирования в Математике.
Задача: Посчитать "гистограммную характеристику" неких свойств объекта.
Объект состоит из множества точек плоскости, с целочисельными координатами.
Позиция в гистограмме и интегральная характеристика, обновляемая в этой позиции формализуются отдельно.
Моё решение:
Код:
(* Вычисление позиции в гистограмме, обновление для одной точки *)
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++, хранилище пар <уникальный_ключ, значение>)?

 
 
 
 Re: Mathematica. Как сделать код "лучше"?
Сообщение08.08.2010, 07:21 
Аватара пользователя
 i  Перемещено из "Программирования" в "Околонаучный софт"

 
 
 
 Re: Mathematica. Как сделать код "лучше"?
Сообщение08.08.2010, 10:49 
ngry в сообщении #343153 писал(а):
Или же какие-то пропущенные мной способы организации map-подобного контейнера
А так не пробовали?
  1. In >  map1[key1] = value1; map1[key2] = value32; (* add/change *) 
  2. In >  map1[key3] // Head != map1 (* exists *) 
  3. Out>  False 
  4. In >  map1[key2] (* get *) 
  5. Out>  value32 
  6. In >  map1[key2] =. (* delete *) 
Просто и со вкусом. :-)

Только я не понял, у вас так или не так. Не нашёл нигде map. Плохо искал.

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group