2015-08-31 62 views
0

我在Matlab中工作,我有一個未排序的向量X。然後我通過取隨機塊從X中提取一個隨機子集,並將子集表示爲Y。例如,我們可以有Y = X([1:3,10:12,16:18])。每次在for循環中隨機提取矢量和Y,並且在對其執行進一步工作之前需要對其進行排序。下面是一些僞代碼:從排序的向量中排序塊子集

X=vector; 
Z=zeros(1000,1); 
for k=1:1000 
    randomblocks=... % obtain the random blocks 
    Y=X(randomblocks); 
    Ysort=sort(Y); 
    Z(k)=dosomething(Ysort); 
end 

這會變得非常慢,由於重複的排序。我的問題是有什麼方法,我們可以在for循環之前排序X,但在for循環中以某種方式提取相同的點,以便它們排序?我不能只將X的排序版本的隨機子集作爲排序X廢除塊結構。我嘗試了一些方法,但他們最終變慢了。

回答

1

你可以嘗試loop免費的做法是這樣的:

%generate all random indices at once 
idx = randomblocks(numel_block , 1000); 
%generate all Ys at once, organized with blocks along the first dimension, iterations along the second 
Y = reshape(X(idx) , [numel_block 1000]); 
%sort along the block dimension 
Ysort = sort(Y,1); 

現在取決於什麼Z = dosomething(Ysort)看起來像這樣在它自己的循環或東西可以去像arrayfun()可以鍛鍊身體。

+0

雖然這不會導致相同數量的總分類嗎?處理時間的瓶頸在於排序功能的多次調用。看來這種方法不能解決這個問題。 – KMoon

+0

這種方法將使用排序函數的單個調用交換排序函數的多個調用,並有機會進行並行處理。 1000個函數調用的開銷很大,以並行方式定義問題爲MATLAB提供了最佳優化機會。 –