Help increasing the speed of a piece of code
古いコメントを表示
Dear all,
Plain summary: I have a temperature matrix and I need to find the average temperature of the 8 pixels surrounding each pixel.
I need to subdivide my 134x134 matrices into 3x3 sub matrices. For each submatrix I need to compute the mean and the standard deviation, excluding the central pixel from the calculation. Then I need to find the values exceding the upper and lower boundaries, namely the mean + standard deviation and the mean - standard deviation, respectively. Then, I need to recalculate the mean excluding the values falling outside the lower and upper boundaries and assign the mean value to the central pixel location (in a new matrix).
The output will be a 134x134 matrix with every value (pixel) corresponding to the average of its surrounding pixels with the "outliers" excluded from the average.
I wrote a code (loop) to do the job, but it was taking ~20 seconds (link to old question and previous code: https://it.mathworks.com/matlabcentral/answers/1947148-help-improving-speed-of-this-code-loop?s_tid=srchtitle ). Someone helped me to improve the original code (see new code below), but it still takes ~2 seconds.
As I need to run it 10k+ times it will take ages to complete. I wonder if you could kindly suggest a faster code to achieve the same result?
Thanks a lot!
A=magic(134); % Assuming this is my 134x134 Temperature matrix
T_background = blockproc(A,[1,1],@BlkFun, 'BorderSize',[1,1],...
'TrimBorder',false, 'PadMethod',NaN);
%where BlkFun=
function v = BlkFun(s)
px = s.data;
if isequal(size(px),[3,3])
px(5) = [];
av = nanmean(px);
sd = nanstd(px);
ix = px>=(av-sd) & px<=(av+sd);
v = nanmean(px(ix));
else
v = NaN;
end
end
採用された回答
その他の回答 (1 件)
per isakson
2023 年 4 月 15 日
編集済み: per isakson
2023 年 4 月 15 日
"I need to do the other steps". Removing NaN before calculating the mean cuts the elapse time in half (on my PC with R2018b)
tic
A=magic(134); % Assuming this is my 134x134 Temperature matrix
T_background = blockproc(A,[1,1],@BlkFun, 'BorderSize',[1,1],...
'TrimBorder',false, 'PadMethod',NaN);
toc
function v = BlkFun(s)
px = s.data;
if isequal(size(px),[3,3])
px(isnan(px)|[0,0,0;0,1,0;0,0,0]) = [];
av = mean(px);
sd = std(px);
ix = px>=(av-sd) & px<=(av+sd);
v = mean(px(ix));
else
v = NaN;
end
end
and hopefully it returns the same result.
カテゴリ
ヘルプ センター および File Exchange で MATLAB についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!