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



我有一个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

这里有一种使用cumsum:的方法

B = cumsum(repmat((A(:, 2)-A(:, 1))/(M-1),1,M),2).';

最新更新