我有一个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).';