FOR 循环的向量化
Vectorization of FOR loop
有没有办法矢量化这个 FOR 循环我知道 gallery ("circul",y) 感谢用户 carandraug
但这只会将单元格转移到下一个相邻的单元格我也尝试过 toeplitz 但那没有用)。
我正在尝试使用 circshift 和变量 shift_over.
使在示例代码中完成的移位可调
变量 y_new 是我试图获得的输出,但不必在示例中使用 FOR 循环(这个 FOR 循环可以矢量化吗) .
请注意: 此示例中使用的数字只是一个示例,实际数组将是 voice/audio 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 64 位。
我很确定这是一个经典的 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.
有没有办法矢量化这个 FOR 循环我知道 gallery ("circul",y) 感谢用户 carandraug 但这只会将单元格转移到下一个相邻的单元格我也尝试过 toeplitz 但那没有用)。
我正在尝试使用 circshift 和变量 shift_over.
使在示例代码中完成的移位可调变量 y_new 是我试图获得的输出,但不必在示例中使用 FOR 循环(这个 FOR 循环可以矢量化吗) .
请注意: 此示例中使用的数字只是一个示例,实际数组将是 voice/audio 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 64 位。
我很确定这是一个经典的 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.