2015-08-25 4 views
0

Мне нужен цикл «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), заполненной повторными данными. Я смягчил ограничение памяти для этого подхода, преобразовывая матрицу в единую точность, но похоже, что должен быть более эффективный способ делать то, что я хочу, чтобы избежать тиражирования большого количества данных.

+0

вы рассмотрели только дублируют 'mc' для одного измерения и использовать петлю для внешнего контура? также рассмотрим перемещение 'i' во внутренний цикл. – user3528438

+0

Для таких больших массивов векторизация, вероятно, вызовет проблемы с памятью. Для циклов не всегда неэффективны, сборка JIT Matlab помогает уменьшить проблемы и улучшить использование памяти для больших проблем. Вы можете использовать параллельный цикл для внешнего цикла. – David

ответ

1

Вы можете использовать bsxfun с несколькими reshapes -

A = bsxfun(@times,y,x.'); %//' 
B = bsxfun(@plus,y,x.'); %//' 
C = mean(bsxfun(@plus,bsxfun(@times,mc,reshape(A,1,[])) , reshape(B,1,[])),1); 
z_out = reshape(C,numel(x),[]).'; 
Смежные вопросы