如何在Matlab中生成乘法空间矢量?

时间:2014-01-11 06:28:51

标签: arrays matlab

我正在尝试“自动”生成向量0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30(在乘法空间中)。

我知道linspace和logspace函数,但我找不到任何类似的乘法空间函数。

有吗?否则,如何生成一个我需要的矢量?

3 个答案:

答案 0 :(得分:3)

使用bsxfun的简单方法,也考虑乘以较小的空格:

x = [0.01,0.03,0.05]    % initial vector, works for various lengths
n = 12;                 % times it should get multiplied in rising direction
m = 3;                  % times it should get multiplied in falling direction

Z = bsxfun( @times, x(:), 10.^(-m:n) )
Z = Z(:)

% if preferred, bulky one-liner:
% Z = reshape( bsxfun( @times, x(:), 10.^(-m:n) ) , 1 , [])    

我假设乘法向量乘以,例如:

10.^(0:n) =   1         10         100        1000       10000      100000  ....

但自定义向量Y也是可能的:

Z = bsxfun( @times, x(:), Y(:)' ) Z = Z(:)

答案 1 :(得分:3)

可以帮助您以非常简单和紧凑的方式实现这一目标的功能是Kronecker张量积kron。 您可以使用它将thewaywewalk's answer重写为:

v = [0.01;0.03;0.05]; % initial vector
emin = -3;            % minimal exponent
emax = 12;            % maximal exponent

Z = kron(10.^(emin:emax)',v(:))

应该给你完全相同的结果。

答案 2 :(得分:2)

效率不高,但这会产生你想要的效果。在这种情况下,inputvec是您的初始向量[0.01 0.03]multiplier10。所需字符串n的长度为8n应为nn(输入向量的长度)的倍数

function newvec=multispace(n,inputvec,multiplier)

nn=length(inputvec);

newvec=zeros(1,n);
newvec(1:nn)=inputvec;
for i=1:n/nn-1
    newvec(i*nn+1:(i+1)*nn)=(newvec((i-1)*nn+1:(i)*nn)).*multiplier;  
end

end