2014-01-11 43 views
2

我想要「自動」生成一個向量0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30(在乘法空間中)。如何在Matlab中生成乘法空間矢量?

我知道linspace和logspace函數,但我找不到任何類似的乘法空間函數。

有沒有?否則,如何生成一個像我需要的矢量?

回答

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(:) 
+2

爲什麼使用'repmat'?轉置'x',讓'bsxfun'處理擴展:'Z = reshape(bsxfun(@times,x',10。^( - m:n)),[],1)''。 – erikced

+0

@erikced:這確實很好用!我總是低估bsxfun的可能性。謝謝!我不是笨重的單線球員的粉絲,我也曾考慮過。無論如何我現在都包括了它。 – thewaywewalk

2

效率不高,但這會產生你想要的。 inputvec是您的初始矢量[0.01 0.03]在這種情況下,multiplier10。所需字符串n的長度爲8nnn(輸入矢量的長度)

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 
3

,可以幫助你在一個非常容易和緊湊的方式實現這一功能是克羅內克張量積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

相關知識! +1!我添加了冒號'(:)'以確保兼容行和列向量輸入。 – thewaywewalk