FOR循环的矢量化

时间:2019-07-08 03:02:06

标签: vectorization octave

有没有一种方法可以矢量化这个我知道的关于画廊(“ circul”,y)的FOR循环 但这只会将单元格移到我也尝试过放大的下一个相邻单元格,但这没有用)。

我正在尝试使移位可调,这是在示例代码中使用circshift和变量shift_over完成的。

变量 y_new 是我尝试获取的输出,但无需在示例中使用FOR循环(可以将此FOR循环向量化)。

请注意::本示例中使用的数字仅是示例,实际数组将是30-60秒的语音/音频信号(因此y_new数组可能很大),并且不会t是像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 个答案:

答案 0 :(得分:1)

我很确定这是一个经典的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.