应用于数组的Linspace

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)

如何在不使用循环的情况下实现此目的?

Nic*_*son 6

我能想到的最快的方法是计算步长,使用隐式二进制扩展从中构造向量.

 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)

那么时间是:

  • 沃尔夫:2.2243 s
  • 我的:0.3643秒
  • 标准循环:1.0953秒
  • arrayfun:2.6298 s