Kap*_*a11 1 matlab vectorization
给出一个类似的数组a = [ -1; 0; 1];.对于每个a(i),我需要计算线性间隔矢量linspace(min(a(i),0),max(a(i),0),3);,其中每个linspace-vector应存储到矩阵中:
A = [-1 -0.5 0;
0 0 0;
0 0.5 1];
Run Code Online (Sandbox Code Playgroud)
使用for循环,我可以这样做:
for i=1:3
A(i) = linspace(min(a(i),0),max(a(i),0),3);
end
Run Code Online (Sandbox Code Playgroud)
如何在不使用循环的情况下实现此目的?
我能想到的最快的方法是计算步长,使用隐式二进制扩展从中构造向量.
a = [ -1; 0; 1];
n = 3;
stepsizes = (max(a,0)-min(a,0))/(n-1);
A = min(a,0) + (0:(n-1)).*stepsizes;
Run Code Online (Sandbox Code Playgroud)
Timeit:
timeit使用(使用timeit(@SO)和删除块中的注释来定时)的几个结果:
function SO()
n = 1e3;
m = 1e5;
a = randi(9,m,1)-4;
% %Wolfie
% aminmax = [min(a, 0), max(a,0)]';
% A = interp1( [0,1], aminmax, linspace(0,1,n) )';
% %Nicky
% stepsizes = (max(a,0)-min(a,0))/(n-1);
% A = min(a,0) + (0:(n-1)).*stepsizes;
% %Loop
% A = zeros(m,n);
% for i=1:m
% A(i,:) = linspace(min(a(i),0),max(a(i),0),n);
% end
%Arrayfun:
A = cell2mat(arrayfun(@(x) linspace(min(x,0),max(x,0),n),a,'UniformOutput',false));
Run Code Online (Sandbox Code Playgroud)
那么时间是:
arrayfun:2.6298 s| 归档时间: |
|
| 查看次数: |
581 次 |
| 最近记录: |