> このような結果が返ってくる理由
col2が3,5,7,... と2ずつ増加していくと4490を跨いでしまい、その次の周期で範囲を超えたインデックスにアクセスしてしまいます。この条件式で閾値を跨がず上手くいくのは、増分 BoxSize = 1 の時だけです。
%block = DataFrame(row1:row2,col1:col2);
% (中略)
% if col2 <= size(DataFrame,2) % 4489 <= 4490 まだ通る!
% col1 = col1 + BoxSize; % col1 = 4487 + 2 = 4489
% col2 = col2 + BoxSize; % col2 = 4489 + 2 = 4491
% 次の周期で DataFrame(row1:row2,4489:4491) にアクセスしてしまう⇒エラー!
> 2×2、つまり(1,1) ~ (3,3)のデータを切り抜く ⇒ 3x3になってしまう
質問の要件とプログラムの動作が違います。今のプログラムでは BoxSize より1大きいデータ群が抜き取られてしまいます。しかも1~3、3~5、5~7、と部分的に重なって意図した最大/最小値が得られていません。
DataFrame = zeros(100,100); % 適当なサンプルデータ
DataFrame(1:3, 1:3) % 左記のサイズは2×2ではなく3×3になる
> 改善案を教えていただきたいです
% -------------------------Main Processing--------------------------------
row1 = 1;
row2 = BoxSize;% + 1; % 【変更点】1からBoxSizeまで
col1 = 1;
col2 = BoxSize;% + 1; % 【変更点】1からBoxSizeまで
%Max_h = zeros(DivNum^2,1);
%Min_h = zeros(DivNum^2,1);
Max_h = zeros((size(DataFrame,2)-2)*(size(DataFrame,1)-2),1);
Min_h = zeros((size(DataFrame,2)-2)*(size(DataFrame,1)-2),1);
ProcessStart_1 = tic;
for num=1:DivNum ^2
block = DataFrame(row1:row2,col1:col2);
Max_h(num) = max(block,[],'all');
Min_h(num) = min(block,[],'all');
%disp([num2str(row1),' ',num2str(col1)])
if col2 <= size(DataFrame,2) - BoxSize % 【変更点】BoxSizeを引いた閾値と比較する
col1 = col1 + BoxSize;
col2 = col2 + BoxSize;
else
row1 = row1 + BoxSize;
row2 = row2 + BoxSize;
col1 = 1;
col2 = BoxSize + 1;
end
%%{
if row2 >= size(DataFrame,1) + 1
break
end
%}
end