我想要「自動」生成一個向量0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30
(在乘法空間中)。如何在Matlab中生成乘法空間矢量?
我知道linspace和logspace函數,但我找不到任何類似的乘法空間函數。
有沒有?否則,如何生成一個像我需要的矢量?
我想要「自動」生成一個向量0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30
(在乘法空間中)。如何在Matlab中生成乘法空間矢量?
我知道linspace和logspace函數,但我找不到任何類似的乘法空間函數。
有沒有?否則,如何生成一個像我需要的矢量?
與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(:)
效率不高,但這會產生你想要的。 inputvec
是您的初始矢量[0.01 0.03]
在這種情況下,multiplier
是10
。所需字符串n
的長度爲8
。 n
應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
,可以幫助你在一個非常容易和緊湊的方式實現這一功能是克羅內克張量積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(:))
這應該給你確切的結果相同。
相關知識! +1!我添加了冒號'(:)'以確保兼容行和列向量輸入。 – thewaywewalk
爲什麼使用'repmat'?轉置'x',讓'bsxfun'處理擴展:'Z = reshape(bsxfun(@times,x',10。^( - m:n)),[],1)''。 – erikced
@erikced:這確實很好用!我總是低估bsxfun的可能性。謝謝!我不是笨重的單線球員的粉絲,我也曾考慮過。無論如何我現在都包括了它。 – thewaywewalk