How to pre-allocate my loop for speed?
2 ビュー (過去 30 日間)
古いコメントを表示
Hi,
I have a script to help process my collected altimeter data to derive seagrass heights. My script isnt quite working as one of my loops doesn't want to run properly and has an error of exceeding matrix bounds.
This is the loop that doesn't work: It is finding peaks above the seabed which it assumes are seagrass and the lower peaks as the seabed. I hope this makes sense.
for i = 1:length(ping_time)
[pks,locs] = findpeaks(bin_corr(:,i),'NPeaks',3,'MinPeakDistance',3,'MinPeakProminence',4); % tuning units are distance = bin number, prom = correlation value
if length(locs) == 1
pk_seagrass(i) = NaN;
pk_seabed(i) = bin_depth(locs);
elseif length(locs) == 2
pk_seagrass(i) = bin_depth(locs(1));
pk_seabed(i) = bin_depth(locs(2));
elseif length(locs) == 3
pk_seagrass(i) = bin_depth(locs(1));
pk_seabed(i) = bin_depth(locs(3));
elseif length(locs) == 0
pk_seagrass(i) = NaN;
pk_seabed(i) = NaN;
end
end
Any help or suggestions are much appreciated! Thank you :)
1 件のコメント
Jan
2021 年 7 月 26 日
Please post a copy of the complete error message. It contains important information and sharing thos makes it easier to help you.
採用された回答
Star Strider
2021 年 7 月 26 日
I am not certain what the problem is, however the preallocation would be straightforward:
pk_seagrass = NaN(1,length(ping_time));
pk_seabed = NaN(1,length(ping_time));
This produces row vectors for both variables. Put them just above the for call.
.
2 件のコメント
Star Strider
2021 年 7 月 29 日
As always, my pleasure!
Note that preallocating is always appropriate. In my experience, it results in about a 20% improvement in execution speed. This is not always obvious with small arrays, however can reduce the processing time for large arrays by several minutes, even in computers with SSDs.
.
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!