% RANDINTERVAL -多個區間內的隨機數
%
% R = RANDINTERVAL(N,INTERVALS)返回壹個N乘N的隨機數矩陣R
%取自多個時間間隔內的均勻分布。
%
%類似RAND,RANDINTERVAL([N M],..)返回壹個N乘M的矩陣,並且
% RANDINTERVAL([N...],..)返回壹個N乘M乘P乘-..數組。註意
%表示類似於rand(N,M,P,..)不可用。
%
% INTERVALS是壹個N乘2的矩陣,其中的行指定從
%其中的數字是畫出來的。每個區間都有壹個下界
%(在間隔的第壹列)和上限(的第二列
%區間)。如果下限等於上限,沒有數字會
從該間隔中抽取%。上限不能小於
%下限。
%如果間隔是向量(K乘1或1乘K),則間隔為
%形成為(區間(1),區間(2)),(區間(2),區間(3)),
% ...,(區間(K-1),區間(K))。在這種情況下,數量
%間隔N比元素K的數量小1,即N=K-1。
%區間的相對長度決定了
從該間隔中抽取%數。例如,當間隔為[1
% 2 ;10 12],從第壹個數字中抽取壹個數字的概率
%區間(1,2)是1取3,vs第二區間(10,12)是2取3。
%
% R = RANDINTERVAL(N,區間,權重)允許對每個區間進行加權
特別是%區間。權重是N個數字的向量。這些數字
%指定,結合相應區間的長度,
%每個區間的相對可能性(即權重)。更大的
W(k)的%值增加了從
第% k個間隔。
%例如,當間隔為[11 12;20 21]而權重是[3 1],則
從第壹個區間抽取號碼的概率是3/10
% 4,vs 1第二間隔4。請註意,兩個間隔都有
%相同的長度。當間隔不具有相同的長度時
從長度為L(k)的區間k中抽取壹個數的可能性百分比
%和重量W(k)由下式給出:
% p(k) = (W(k) x L(k)) / sum(W(i)。/ L(i)),i=1:N
%
% [R,IND] =隨機區間(..)還返回壹個索引數組IND,它具有
%與r的大小相同。IND包含1和之間的數字
%間隔。長度和/或權重為零的區間不會
%存在於IND中。
%
%備註:
% -允許重疊間隔,但可能會產生難以調試的問題
%結果。在這種情況下,會發出警告。另壹方面,這樣的
%重疊間隔可以(ab-)用於從特定的
%分布。
% -對於單個區間(A B ),該函數相當於
% A + (B-A) *蘭特(N)
%
%示例:
% %基本使用,無重量
% R = randinterval([1,10000],[1 3;5 7 ;10 15 ;20 26]) ;
% %返回1和3之間的10000個數字的行向量,介於
% % 5和7,介於10和15之間,或者介於20和26之間。大約
% % 2/5的數字介於20和26之間:
% N = histc(R,[-Inf 1 3 5 7 10 15 20 26 Inf]),N = N ./ sum(N),bar(N)
%
% %重量
% [R,n] = randinterval([10,100],[1 2;100 200 ;-2 -1 ;12 12], [1 0 2 3]) ;
% %返回壹個10乘100的矩陣,其值在區間(-2,-1)內
% %或(1,2)。大約有666個數字是負數:
% sum(R(:)& lt;0)、sum(n(:)==3)
% %區間(100,200)的權重為零,區間
% % (12,12)長度為零;這些都是“忽略”的。
% histc(n(:),1:4)
%
% %帶權重的相鄰間隔:
% [R,n] = randinterval([10000,1],[-2:2],[1 4 2 8]);
% bar(-2:2,histc(R,-2:2)/100,' histc ');ylabel('百分比')
%
%參見RAND,RANDN,RANDPERM
% RANDSAMPLE(統計工具箱)
文件交換
%適用於Matlab R13及更高版本
%版本1.0(2008年10月)
% (c)何塞·範德爾吉斯特
%電子郵件:jos@jasen.nl
%歷史記錄
%創建時間:2008年10月
修訂百分比:-
%參數檢查
error(nargchk(2,3,nargin));
if ndims(Interval)~ = 2 | | ~ is numeric(Interval)| | numel(Interval)& lt;2,
錯誤([mfilename]:interval wrongsize '],...
間隔應該是N乘2(或N乘1,N > 0。1)數值矩陣。)
結束
如果min(大小(區間))== 1,
% Interval是壹個向量。生成邊界列向量
lower bound = shape(Interval(1:end-1),[],1);
upper bound = shape(Interval(2:end),[],1);
elseif size(Interval,2)~= 2
錯誤([mfilename]:interval wrongsize '],...
間隔應該是壹個N乘2(或N乘1)的數字矩陣。)
其他
%獲取間隔的下限和上限
LowerBound = Interval(:,1);
UpperBound = Interval(:,2);
結束
如果有(UpperBound & lt下界),
錯誤([mfilename ':NegativeInterval'],...
間隔不能小於0’);
結束
如果nargin = = 3 & amp& amp(~ is empty(Weight)| | ~ is numeric(Weight)),
如果numel(重量)~= numel(下限),
錯誤([mfilename]:WeightsWrongSize '],...
重量的數量應該與間隔的數量相匹配。) ;
結束
如果有(重量& lt0)
錯誤([mfilename]:weights negative '],...
權重不能為負。)
結束
其他
%默認情況下,所有間隔的可能性相等
重量= 1;
結束
tmp =[lower bound upper bound];
如果有(isnan(tmp(:))| isinf(tmp(:))| | any(isnan(Weight(:))| isinf(Weight(:))),
錯誤('間隔或權重不能包含nan或INF。') ;
結束
%當間隔重疊時給出警告是很好的。如果他們這樣做了
間隔的%下限小於前壹個間隔的上限
%間隔,當間隔按排序順序排列時
tmp = sort rows(tmp);
如果有的話(tmp(2:end,1)& lt;tmp(1:end-1,2)),
警告([mfilename]:OverlappingIntervals '],...
音程重疊。) ;
結束
%訣竅是把所有的音程放在壹起。間隔為
%較大的權重應該會變大,所以更有可能。整個
% range跨越0和IntervalEdges之間的數字(結束):
IntervalSize =(upper bound-lower bound);
interval edges =[0;累計和(權重(:)。* IntervalSize(:))】。;
如果IntervalEdges(end) == 0,
%所有間隔的長度和/或權重都為零,因此
%無事可做!
錯誤([mfilename ':AllZero'],...
所有區間的長度和/或權重都為零。) ;
結束
嘗試
%讓RAND捕捉大小參數中的錯誤
R =蘭特(N);% 0到1之間的隨機數
捕捉
%重新表述錯誤
ERR = lasterror
ERR.message = strrep(ERR.message,' rand ',[mfilename '(在對RAND的調用中)']);
rethrow(ERR);
結束
如果isempty(R),
%無事可做,例如當N包含0時。
ind =[];
返回
結束
%這些隨機的隨機數屬於哪個區間
[ind,ind]= histc(IntervalEdges(end)* R(:),IntervalEdges);% #好,不使用第壹個輸出
%現在將0到1之間的壹系列新隨機數映射到它們的
%各自的間隔。我們必須創造壹個新的系列,否則就不行了
%區間內的所有值都是可能的。
r(:)= lower bound(ind)+interval size(ind)。*蘭德(numel(R),1);
%也返回與R形狀相同的區間數
ind = reshape(ind,size(R));
% % #調試圖
% E = linspace(min(Interval(:)),max(Interval(:)),100);
% N2 = histc(R(:),E);
%圖;
%支線劇情(2,1,1);酒吧(東,N2,“歷史”)
%支線劇情(2,1,2);繪圖(排序(R(:),' k . ')
%%%%%%%%這是函數。存起來直接調用!
& gt& gt[k1,k2]= rand interval([1 10],[1 2;5 6],[3 1])
k1 =
5.6154 1.7919 1.9218 1.7382 5.1763 5.4057 1.9355 1.9169 5.4103 1.8936
k2 =
2 1 1 1 2 2 1 1 2 1