以下で説明する問題の適切な解決策を見つけるのにしばらく苦労してきました。for ループを回避したいのですが、Matlab のスキルではそれ以外のことはできないと感じています。サイズ 329x230x105 の 3D 位置マトリックスがあります。これは、10000x7000x3100 メートルの 3D ボリュームを定義します。サブボリュームを除いて、ほとんどの行列要素はゼロです。
元のマトリックスと同じサイズのマスクを作成する必要があります。このマスクは大きなサブマティックに分割され、それぞれが 1000x1000x1000 メートルの通常のサブボリュームを定義し、少なくとも 1 つのオン要素 (非ゼロ) 元のマトリックスから。XY で表示:
したがって、最終結果は、マークされたセル (赤) 内のすべての要素の値が 1 で、外側の要素が 0 に設定されている 3D マスク (下の XY の図) です。
ボリューム バウンディング ボックスや凸包の頂点には関心がないことに注意してください。
よろしくお願いします。
追加情報、@grantnz への回答:
さて、次のコードがすべての状況で機能するかどうかはまだわかりませんが、これが私が行うことです (私のラップトップでは 10 秒近くかかります)。
% get subscripts of non-zero 3d grid cells
[u v w]=ind2sub(size(tmpT),find(tmpT)); % tmpT is the original 230x329x105 matrix
increm = 30.480061; % grid cell size in meters
U=(u-1)*increm; % convert subscripts to position in meters
V=(v-1)*increm;
W=(w-1)*increm;
U=U/1000; % round down to nearest 1000 meter
V=V/1000;
W=W/1000;
U=floor(U);
V=floor(V);
W=floor(W);
U=U*1000;
V=V*1000;
W=W*1000;
U=round(U/increm); % find subscripts of 1000 meter cells
V=round(V/increm);
W=round(W/increm);
U(U==0)=1; % make sure no zero
V(V==0)=1;
W(W==0)=1;
IX=[U V W]; % make subscript matrix
[q,i,j]=unique(IX,'rows'); % find unique vectors in subscript matrix
myMask=zeros(size(tmpT)); % initiate mask matrix
oneKM = 33; % this many cells in 1000 meters
for i=1:length(q) % for each position vector, set mask (from:from+1000 meter) to 1
myMask(q(i,1):q(i,1)+oneKM,q(i,2):q(i,2)+oneKM,q(i,3):q(i,3)+oneKM)=1;
end