Векторизация цикла FOR - PullRequest
0 голосов
/ 08 июля 2019

Есть ли способ векторизовать этот цикл FOR, который я знаю о gallery ("circul", y) благодаря пользователю carandraug но это только сместит ячейку к следующей соседней ячейке, я также попытался toeplitz, но это не работало).

Я пытаюсь настроить смещение, которое выполняется в примере кода с помощью circshift и переменной shift_over.

Переменная y_new - это вывод, который я пытаюсь получить, но без использования цикла FOR в примере (можно ли этот цикл FOR векторизовать).

Обратите внимание: Числа, которые используются в этом примере, являются лишь примером того, что реальный массив будет представлять собой голосовые / звуковые сигналы длительностью 30-60 секунд (поэтому массив y_new может быть большим) и не будет быть последовательными числами, такими как 1,2,3,4,5.

tic
y=[1:5];
[rw col]= size(y); %get size to create zero'd array
y_new= zeros(max(rw,col),max(rw,col)); %zero fill new array for speed

shift_over=-2; %cell amount to shift over

for aa=1:length(y)
  if aa==1
    y_new(aa,:)=y; %starts with original array
  else  
    y_new(aa,:)=circshift(y,[1,(aa-1)*shift_over]); %
  endif
end
y_new

fprintf('\nfinally Done-elapsed time -%4.4fsec- or -%4.4fmins- or -%4.4fhours-\n',toc,toc/60,toc/3600);


y_new =

           1           2           3           4           5
           3           4           5           1           2
           5           1           2           3           4
           2           3           4           5           1
           4           5           1           2           3

Ps: я использую Octave 4.2.2 Ubuntu 18.04 64bit.

1 Ответ

1 голос
/ 08 июля 2019

Я почти уверен, что это классическая проблема XY, когда вы хотите что-то вычислить, и вы думаете, что это хорошая идея - создать избыточную матрицу n x n, где n - длина вашего аудиофайла в сэмплах. Возможно, вы хотите поиграть с автокорреляцией , но ключевой момент здесь заключается в том, что я сомневаюсь, что построение запрошенной матрицы - хорошая идея , но вы идете:

Ваш код:

y = rand (1, 3e3);
shift_over = -2;

clear -x y shift_over
tic
[rw col]= size(y); %get size to create zero'd array
y_new= zeros(max(rw,col),max(rw,col)); %zero fill new array for speed

for aa=1:length(y)
  if aa==1
    y_new(aa,:)=y; %starts with original array
  else  
    y_new(aa,:)=circshift(y,[1,(aa-1)*shift_over]); %
  endif
end
toc

мой код:

clear -x y shift_over
tic
n = numel (y);
y2 = y (mod ((0:n-1) - shift_over * (0:n-1).', n) + 1);
toc

дает в моей системе:

Elapsed time is 1.00379 seconds.
Elapsed time is 0.155854 seconds.
...