Я использую Mathematica 7 для обработки большого набора данных.Набор данных представляет собой трехмерный массив целых чисел со знаком.Три уровня можно рассматривать как соответствующие X баллов за снимок , Y снимков за сканирование и Z сканирований за набор .
У меня также есть выстрел «обнуления» (содержащий X точек, которые являются дробными знаками целых чисел ), который я хотел бы вычесть из каждого снимка в наборе данных.После этого мне больше никогда не понадобится исходный набор данных.
Как я могу выполнить это преобразование без создания новых копий набора данных или его частей в процессе?Концептуально набор данных находится в памяти, и я хотел бы просмотреть каждый элемент и изменить его в этом месте в памяти, не копируя его постоянно в какую-то другую область памяти.
Следующее автономноекод захватывает все аспекты того, что я пытаюсь сделать:
(* Create some offsetted data, and a zero data set. *)
myData = Table[Table[Table[RandomInteger[{1, 100}], {k, 500}], {j, 400}], {i, 200}];
myZero = Table[RandomInteger[{1, 9}]/RandomInteger[{1, 9}] + 50, {i, 500}];
(* Method 1 *)
myData = Table[
f1 = myData[[i]];
Table[
f2 = f1[[j]];
f2 - myZero, {j, 400}], {i, 200}];
(* Method 2 *)
Do[
Do[
myData[[i]][[j]] = myData[[i]][[j]] - myZero, {j, 400}], {i, 200}]
(* Method 3 *)
Attributes[Zeroing] = {HoldFirst};
Zeroing[x_] := Module[{},
Do[
Do[
x[[i]][[j]] = x[[i]][[j]] - myZero, {j, Length[x[[1]]]}
], {i, Length[x]}
]
];
(Примечание: шляпа подсказка для Аарона Хонеккера для метода № 3.)
На моеммашина (процессор Intel Core2 Duo 3,17 ГГц, 4 ГБ ОЗУ, 32-разрядная ОС Windows 7), все три метода используют примерно 1,25 ГБ памяти, с обтекателем № 2 и № 3 чуть лучше.
Если я неНе забывайте терять точность, оборачивая N[ ]
во внутренности myData
и myZero
, когда они создаются, изначально увеличивает их размер в памяти на 150 МБ, но уменьшает объем памяти, необходимый для обнуления (методами # 1-№ 3 выше) с 1,25 ГБ до всего лишь 300 МБ!Это мое рабочее решение, но было бы здорово узнать, как лучше всего решить эту проблему.