arrayfun в bsxfun возможен

Я знаю, что bsxfun (который работает быстро!) и arrayfun (насколько я понял, использует внутренние циклы, которые, как ожидается, будут медленными) предназначены для разных целей, по крайней мере, на самом базовом уровне.

Сказав это, я пытаюсь

  1. суммировать все числа в заданном массиве, скажем, y, до определенного индекса
  2. добавьте число в определенном месте (которое является числом в указанном выше месте индекса) к вышеуказанной сумме.

Я мог бы легко выполнить это с помощью приведенного ниже примера кода:

% index array
x = [ 1:6 ]; % value array
y = [ 3 3 4 4 1 1 ];
% arrayfun version
o2 = arrayfun(@(a) ...
              sum(y(1:(a-1)))+...
              y(a), ...
              x)

Но, кажется, он медленный на больших входах.

Мне было интересно, как можно преобразовать это в версию, которая работает с bsxfun, если это возможно.

P.S. числа в y не повторяются, как указано выше, это был просто пример, это также может быть [3 4 3 1 4 ...]


person Umut Tabak    schedule 29.10.2017    source источник
comment
Вы смотрели cumsum?   -  person beaker    schedule 29.10.2017


Ответы (2)


Всегда ли x имеет вид 1 : n? Предполагая, что ответ да, вы можете получить тот же результат с гораздо более быстрым кодом:

o2 = cumsum(y);

Примечание: вам не нужны скобки в определении x.

person verbatross    schedule 29.10.2017
comment
Действительно, я также пришел к тому же результату, исследуя больше ;-) +1 - person Umut Tabak; 29.10.2017

если у вас есть поддерживаемое устройство с графическим процессором, вы можете определить свои переменные как тип gpuArray, поскольку arrayfun, bsxfun и pagefun совместимы с графическими процессорами. Вычисления на GPU должны быть быстрее для больших данных.

person Baback Kh    schedule 05.05.2018