我可以在Matlab中使用向量作为linspace函数的边界输入吗?

我可以在Matlab中使用向量作为linspace函数的边界输入吗?,matlab,Matlab,我有一个Nx2矩阵A,其中每一行都是上界和下界对,我想创建一个MxN矩阵B,其中每一列都是A对应行中上界和下界的M个元素的邻域 例如: A = [ 2 10 ; 20 100 ; 30 50 ; 0.1 0.5 ] M值为5时,应给出以下结果: B = [ 2 20 30 0.1 ; 4 40 35 0.2 ; 6 60 40 0.3 ; 8 80 45 0.4 ; 10

我有一个Nx2矩阵A,其中每一行都是上界和下界对,我想创建一个MxN矩阵B,其中每一列都是A对应行中上界和下界的M个元素的邻域

例如:

A = [   2  10  ;
       20 100  ;
       30  50  ;
      0.1 0.5  ]
M值为5时,应给出以下结果:

B = [  2  20 30 0.1 ; 
       4  40 35 0.2 ;
       6  60 40 0.3 ;
       8  80 45 0.4 ;
      10 100 50 0.5 ]
我可以通过一个循环轻松做到这一点:

B = zeros(M,size(A,1));
for i = 1:size(A,1)
  B(:,i) = linspace(A(i,1),A(i,2),M)';
end

但如果可能的话,我想知道一种更为Matlab-y的方法。

您可以通过两个bsxfun调用生成该结果,但我不确定这是否足够:D

A = [   2  10  ;
        20 100  ;
        30  50  ;
        0.1 0.5  ]
M = 5;
B = bsxfun(@plus, A(:, 1), ...
    bsxfun(@times, A(:, 2)-A(:, 1), linspace(0, 1, M)))';
使用R2016b,在这里性能更好

nTest = 10000;
d = 1000;
M = 50;
A = rand(d, 2)*100;
tic
for i=1:nTest
    B1 = bsxfun(@plus, A(:, 1), ...
        bsxfun(@times, A(:, 2)-A(:, 1), linspace(0, 1, M)))';
end
toc
tic
for j=1:nTest
    B2 = zeros(M,size(A,1));
    for i = 1:size(A,1)
        B2(:,i) = linspace(A(i,1),A(i,2),M)';
    end
end
toc
maxDiff = max(max(abs(B1-B2)))
结果:

运行时间为1.380361秒。 运行时间为9.965803秒

maxDiff= 2.8422e-14


您可以通过两次调用bsxfun生成该结果,但我不确定这是否足够:D

A = [   2  10  ;
        20 100  ;
        30  50  ;
        0.1 0.5  ]
M = 5;
B = bsxfun(@plus, A(:, 1), ...
    bsxfun(@times, A(:, 2)-A(:, 1), linspace(0, 1, M)))';
使用R2016b,在这里性能更好

nTest = 10000;
d = 1000;
M = 50;
A = rand(d, 2)*100;
tic
for i=1:nTest
    B1 = bsxfun(@plus, A(:, 1), ...
        bsxfun(@times, A(:, 2)-A(:, 1), linspace(0, 1, M)))';
end
toc
tic
for j=1:nTest
    B2 = zeros(M,size(A,1));
    for i = 1:size(A,1)
        B2(:,i) = linspace(A(i,1),A(i,2),M)';
    end
end
toc
maxDiff = max(max(abs(B1-B2)))
结果:

运行时间为1.380361秒。 运行时间为9.965803秒

maxDiff= 2.8422e-14

以下是一种使用方法:

以下是一种使用方法:


如果没有事先分配要填充的变量,那么测量执行时间可能有点误导。请看@max I'm guskenny83没有改变循环中矩阵的大小。实际上,我在计时中也包括了预分配开销。哦,是的,我忽略了这一点。仅用零填充它不应导致时间上的差异。R2016b的oO删除可以使用运算符来代替bsxfun进行隐式扩展:a:,1+a:,2-a:,1.*linspace0,1,M.。如果事先未分配要填充的变量,则测量执行时间可能有点误导。请看@max I'm guskenny83没有改变循环中矩阵的大小。实际上,我在计时中也包括了预分配开销。哦,是的,我忽略了这一点。仅仅用零填充它不应该在时间上造成如此大的差异,因为R2016b的oO删除,您可以使用操作符来代替bsxfun进行隐式扩展:a:,1+a:,2-a:,1.*linspace0,1,M.'