Vectorization of while loop
6 ビュー (過去 30 日間)
古いコメントを表示
Hi all,
I have a small function, which generates random numbers in a specific interval. The function tests the generated values in respect to a certain bound and recalculates the random numbers again, if the bound is violated. I have to call this function several times (in this case 60 000 times), so this takes a lot of time (3/4 of the total time). I have read about vectorizing the code to improve performance. But I am totally helpless with this task. Your help would be greatly appreciated.
However, if someone has an idea to rewrite the while loop in a different way that would be great, as well.
Michi
Code:
meanValue = 10;
devValue = 1;
numValues = 10000;
presumption = 1;
for i = 1:60000
arrayValues = RandomNums(meanValue, devValue, numValues, presumption);
end
function arrayValues = RandomNums (meanValue, devValue, numValues, presumption)
%% create rand nums
% normally distributed with meanValue +/- devValue
numValues = round(numValues);
arrayValues = devValue*randn(numValues,1) + meanValue;
% check confidence-limes for each value and create new one if outside
for idx = 1:numel(arrayValues)
while (arrayValues(idx) > (meanValue + presumption*devValue) || arrayValues(idx) < (meanValue - presumption*devValue))
arrayValues(idx) = devValue*randn(1,1,'double') + meanValue;
end
end
end
Performance:
2 件のコメント
Bruno Luong
2020 年 7 月 15 日
You should look for "truncated gaussian" distribution, and posts how to generate them.
採用された回答
Bruno Luong
2020 年 7 月 16 日
meanValue = 10;
devValue = 1;
numValues = 1000000;
presumption = 2;
tic
% Function from here https://www.mathworks.com/matlabcentral/fileexchange/23832-truncated-gaussian
arrayValues = meanValue + TruncatedGaussian(-devValue, presumption*[-1 1], [1 numValues]);
toc % Elapsed time is 0.055511 seconds for one billions random numbers.
% Check histogram
hist(arrayValues,100)
Histogram obtained
3 件のコメント
Bruno Luong
2020 年 10 月 3 日
It mainly because it uses different method (non rejection) and inverse error function.
その他の回答 (1 件)
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!