Как Крис Луенго упоминает в комментарии , вы всегда будете иметь дело с компромиссом между скоростью и памятью.Тем не менее, у вас есть один вариант - вычислять каждую из ваших 4 переменных сетки (u11grid u12grid u22grid u21grid
), когда это необходимо, вместо того, чтобы вычислять их один раз и сохранять.Вы сэкономите на памяти, но потеряете скорость, если будете повторно вычислять каждый из них несколько раз.
Решение, которое я придумал, заключается в создании анонимной функции эквивалента для каждой из 4 переменных сетки,используя комбинации repmat
и repelem
для вычисления каждого по отдельности вместо ndgrid
для вычисления их всех вместе:
u11gridFcn = @() repmat((-2:0.1:2).', 41.^3, 1);
u12gridFcn = @() repmat(repelem((-2:0.1:2).', 41), 41.^2, 1);
u22gridFcn = @() repmat(repelem((-2:0.1:2).', 41.^2), 41, 1);
u21gridFcn = @() repelem((-2:0.1:2).', 41.^3);
sg = 41.^4;
Затем вы бы использовали их, заменив каждое использование ваших четырех переменных сетки в U1grid
и U2grid
их соответствующим вызовом функции.Для приведенного выше конкретного примера это будет новый код для U1grid
и U2grid
(обратите внимание также на использование inf(...)
вместо Inf*ones(...)
, небольшая деталь):
U1grid = [-u11gridFcn() ...
-u21gridFcn() ...
-u12gridFcn() ...
-u22gridFcn() ...
inf(sg, 1) ...
-inf(sg, 1)];
U2grid = [u21gridFcn()-u11gridFcn() ...
-u21gridFcn() ...
u22gridFcn()-u12gridFcn() ...
-u22gridFcn() ...
inf(sg, 1) ...
-inf(sg, 1)];
В этом примере вы избегаете памяти, необходимой для хранения 4-х переменных сетки, но значения u11grid
и u12grid
будут вычисляться дважды, а значения u21grid
и u22grid
- каждый.рассчитать три раза.Вероятно, небольшой компромисс по времени для потенциально значительной экономии памяти.