Можно ли заменить 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