Для эталонного сравнения я рассмотрим простую функцию:Оптимизация функции «маска» в Matlab
function dealiasing2d(where_dealiased, data)
[n1, n0, nk] = size(data);
for i0=1:n0
for i1=1:n1
if where_dealiased(i1, i0)
data(i1, i0, :) = 0.;
end
end
end
Это может быть полезным в псевдо-спектрального моделирования (где data
является 3d массив комплексных чисел), но в основном он применяет маску к набору изображений, помещая в нули некоторые элементы, для которых истинно where_dealiased
.
Я сравниваю производительность различных языков (и реализаций, компиляторов, ...) в этом простом случае. Для Matlab я использую функцию с timeit. Поскольку я не хочу сравнивать свое незнание в Matlab, я бы хотел оптимизировать эту функцию с помощью этого языка. Каким будет самый быстрый способ сделать это в Matlab?
Простое решение я использую сейчас:
function dealiasing2d(where_dealiased, data)
[n1, n0, nk] = size(data);
N = n0*n1;
ind_zeros = find(reshape(where_dealiased, 1, []));
for ik=1:nk
data(ind_zeros + N*(ik-1)) = 0;
end
Я подозреваю, что это не правильный способ сделать это, так как аналогичное решение Numpy примерно в 10 раз быстрее.
import numpy as np
def dealiasing(where, data):
nk = data.shape[0]
N = reduce(lambda x, y: x*y, data.shape[1:])
inds, = np.nonzero(where.flat)
for ik in xrange(nk):
data.flat[inds + N*ik] = 0.
Наконец, если кто-то говорит мне что-то вроде «Если вы хотите быть очень быстро с той или иной функции в Matlab, вы должны скомпилировать его так: [...]», я включил бы такое решение в эталон.
Edit:
После 2 ответов, я протестированные предложения, и кажется, что нет никакого заметного улучшения производительности. Это странно, потому что простое решение Python-Numpy действительно (на порядок) намного быстрее, поэтому я все еще ищу лучшее решение с Matlab ...
Похожий вопрос: http://stackoverflow.com/questions/3407525/how-can-i-index -a-3-d-matrix-with-a-2-d-mask-in-matlab – knedlsepp