点群をメッシュ状に分類してデータ重複を確認したい

12 views (last 30 days)
Yu
Yu on 11 Nov 2021
Commented: Yu on 16 Nov 2021
こんにちは。
添付写真のような、XY平面上の点群データがあります。
これらを例えば10m毎のメッシュに分け、
①データの存在するグリッドと存在しないグリッドの区別
②同じ座標範囲において、異なるデータセットのグリッドの重複率を評価
③可能であれば、グリッド内の点数も反映できると嬉しいです
したいと思っております。
良さそうな方法が見つからず、良いアイディアをお持ちの方がいらっしゃいましたらご教示いただけますと嬉しいです。
宜しくお願いいたします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 11 Nov 2021
Edited: Atsushi Ueno on 12 Nov 2021
二変量ヒストグラムでの解析が良さそうな方法だと思います。
例)x/y共0~12000[m]の区間に200個ずつ2種類のデータA,Bを作り、200[m]毎のグリッドに区切りました。
  表示や一部の計算はAについてのみ実施しました。
grid = 200; % [m]
maxlim = 12000;
mesh = grid/2:grid:maxlim-grid/2;
A = [randi(maxlim,200,1),randi(maxlim,200,1)]; % 異なるデータセット
B = [randi(maxlim,200,1),randi(maxlim,200,1)]; % 異なるデータセット
hist3(A,'Ctrs',{mesh mesh},'EdgeColor','k','FaceColor','interp','CDataMode','auto');
xlabel('X [m]'); ylabel('Y [m]');
xlim([0 maxlim]); ylim([0 maxlim])
colorbar;
hold on;
またヒストグラムのデータを数値として出力し、質問①②③の要求に応えました。
% ③グリッド内の点数(各グリッド内のデータ個数が行列で出力されます)
NA = hist3(A,'Ctrs',{mesh mesh});
NB = hist3(B,'Ctrs',{mesh mesh});
% ①データの存在する/しないグリッドの区別その1(存在する所の添字を抽出)
h = height(NA);
[row,col] = ind2sub([h h], find(NA)); % このデータは結局ここでは使ってません
% ①データの存在する/しないグリッドの区別その2(データ個数⇒True/Falseに変換)
NA_bool = logical(NA);
NB_bool = logical(NB);
% ②同じ座標範囲において、異なるデータセットのグリッドの重複率を評価
QA2 = NA_bool & NB_bool; % 両方共データが存在するグリッドを得る
% Plot
N_pcolor = double(QA2'); % boolからdoubleに変換する
N_pcolor(size(N_pcolor,1)+1,size(N_pcolor,2)+1) = 0;
xl = linspace(0,maxlim,size(N_pcolor,2));
yl = linspace(0,maxlim,size(N_pcolor,1));
h = pcolor(xl,yl,N_pcolor);
h.ZData = -3 * ones(size(N_pcolor));
ax = gca;
ax.ZTick(ax.ZTick < 0) = [];
  • 上のマップはデータAの分布を示します
  • 下のマップはデータAとデータBが共に存在する区間の分布を示します
  3 Comments
Yu
Yu on 16 Nov 2021
返信が遅くなりましてすみません。
丁寧にご解説くださりありがとうございました!
logicalとpcolor、大変勉強になりました。
おかげさまで目的を達成できました。

Sign in to comment.

More Answers (1)

Hernia Baby
Hernia Baby on 11 Nov 2021
Edited: Hernia Baby on 11 Nov 2021
まずはテキトーに整数のデータでも作ります
clear
A = [randi(9,100,1),randi(9,100,1)];
ここでメッシュを切ります
x = (1:9)';
y = (1:9)';
Tx = [x-0.5,x+0.5];
Ty = [y-0.5,y+0.5];
ここで各メッシュに入るグリッドを分けます
for i = 1:height(Tx)
for j = 1:height(Ty)
idx1 = A(:,1) > Tx(i,1) & A(:,1) <= Tx(i,2);
idx2 = A(:,2) > Ty(j,1) & A(:,2) <= Ty(j,2);
Category{i,j} = A(idx1&idx2,:);
end
end
数を数えます
Count = cellfun(@(x) height(x),Category,'UniformOutput',false)
Count = 9×9 cell array
{[2]} {[0]} {[0]} {[0]} {[1]} {[1]} {[2]} {[0]} {[4]} {[1]} {[1]} {[1]} {[0]} {[1]} {[0]} {[2]} {[3]} {[1]} {[2]} {[2]} {[1]} {[2]} {[0]} {[1]} {[0]} {[2]} {[2]} {[4]} {[0]} {[6]} {[0]} {[2]} {[0]} {[1]} {[2]} {[0]} {[0]} {[0]} {[0]} {[1]} {[1]} {[1]} {[1]} {[1]} {[2]} {[1]} {[2]} {[0]} {[0]} {[1]} {[3]} {[0]} {[4]} {[0]} {[1]} {[4]} {[3]} {[3]} {[1]} {[2]} {[1]} {[1]} {[2]} {[1]} {[0]} {[1]} {[1]} {[1]} {[2]} {[1]} {[0]} {[1]} {[2]} {[1]} {[2]} {[1]} {[1]} {[0]} {[1]} {[0]} {[1]}
  1 Comment
Yu
Yu on 12 Nov 2021
なるほど、このようにセルに分けてカウントする方法もあるのですね。
参考にさせていただきます!教えてくださりありがとうございます。

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!