通常情況下,如果在每次迭代中需要生成一個隨機數,最好在開始時生成所有隨機數,然後在每次迭代中生成一次,您可以檢索您從表中生成的數字。生成循環外的所有隨機數還是動態生成它會更好嗎
但是,我今天遇到了一個與這個直覺相反的問題。我有一個長度爲N的數字向量,在每次迭代中,我必須重新組合這個向量的順序並做一些事情。
我實現2種方式:第一種是完全按照我剛纔所描述的,即,在每次迭代中,我調用函數
V = randperm(N)
在第二方法中,在循環之前,我調用函數
W = arrayfun(@(x)randperm(N),(1:T-1)','UniformOutput',0);
W = cell2mat(W);
這裏T
是迭代的總數。然後在每次迭代中,我只是從矩陣W
中檢索行。然後2個方法的其餘代碼完全相同。
但是,我發現第二個代碼比第一個代碼慢得多(我檢查了命令:W = arrayfun(@(x)randperm(N),(1:T-1)','UniformOutput',0);
不需要太多時間)。我運行分析器,我發現在第二個代碼中調用函數ismember>ismemberR2012a
比第一個代碼多3倍。我無法弄清楚爲什麼。
是否需要使用'r andperm',而不是像'randi'這可以給你一個大的隨機矩陣? – Matt