Мне нужен цикл «for» в следующем репрезентативном разделе кода, чтобы работать как можно эффективнее. Средняя функция в коде действует как представительский заполнитель для моей собственной функции.Векторизация оценок точек Meshgrid в Matlab
x = linspace(-1,1,15);
y = linspace(2,4,15);
[xgrid, ygrid] = meshgrid(x,y);
mc = rand(100000,1);
z=zeros(size(xgrid));
for i=1:length(xgrid)
for j=1:length(ygrid)
z(i,j) = mean(xgrid(i,j) + ygrid(i,j) + xgrid(i,j)*ygrid(i,j)*mc);
end
end
Я векторизовал код и улучшил его скорость примерно в 2,5 раза, построив матрицу, в которой mc реплицируется для каждой точки сетки. Моя реализация приводит к очень большой матрице (3 x 22500000), заполненной повторными данными. Я смягчил ограничение памяти для этого подхода, преобразовывая матрицу в единую точность, но похоже, что должен быть более эффективный способ делать то, что я хочу, чтобы избежать тиражирования большого количества данных.
вы рассмотрели только дублируют 'mc' для одного измерения и использовать петлю для внешнего контура? также рассмотрим перемещение 'i' во внутренний цикл. – user3528438
Для таких больших массивов векторизация, вероятно, вызовет проблемы с памятью. Для циклов не всегда неэффективны, сборка JIT Matlab помогает уменьшить проблемы и улучшить использование памяти для больших проблем. Вы можете использовать параллельный цикл для внешнего цикла. – David