Можно ли заменить bsxfun на более быструю работу?

У меня есть тысяча звонков в этой строке кода

idx=sub2ind(size(I),x,y);
A=bsxfun(@times,bsxfun(@times, a, d),I(idx));
B=bsxfun(@times,bsxfun(@times, b, d),I(idx));
C=bsxfun(@times,bsxfun(@times, b, c),I(idx));
D=bsxfun(@times,bsxfun(@times, a, c),I(idx));

где a, b, c а также d =1xn матрица и I=mxn матрица (может быть до 1920x1080). Например:

x=10; y=40;
a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);
I=rand(500,500);

Векторизованный метод будет использовать .*Однако после нескольких испытаний .* это половинки МЕНЬШЕ, чем bsxfun (Я использую MATLAB 2017a).

Любое другое предложение, чтобы улучшить это? Я прошу вычисление процессора, но не GPU. Незначительный процент улучшения очень важен, как для расчета за неделю. Спасибо!

Факт: эти строки кодов были скомпилированы в MEX и вызваны 40855882 раза, общее время / время самостоятельной работы - 19558,370 секунд. Это даже не 10% от общего объема вычислений.

1 ответ

Я хотел бы использовать .*, Я знаю, что вы сказали, что это медленнее, но на моем компьютере (и 2016b) это примерно в 70 раз быстрее...

x=10; y=40;
a=rand(1,100);
b=rand(1,100);
c=rand(1,100);
d=rand(1,100);
I=rand(500,500);
idx=sub2ind(size(I),x,y);
n = 10000;
tic
for ii = 1:n % vectorized version
    A1 = a.*d*I(idx);
    B1 = b.*d*I(idx);
    C1 = b.*c*I(idx);
    D1 = a.*c*I(idx);
end
t1 = toc;
tic
for ii = 1:n % bsxfun version
    A=bsxfun(@times,bsxfun(@times, a, d),I(idx));
    B=bsxfun(@times,bsxfun(@times, b, d),I(idx));
    C=bsxfun(@times,bsxfun(@times, b, c),I(idx));
    D=bsxfun(@times,bsxfun(@times, a, c),I(idx));
end    
t = toc;
t/t1
Другие вопросы по тегам