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

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

Risposta accettata

Atsushi Ueno
Atsushi Ueno il 11 Nov 2021
Modificato: Atsushi Ueno il 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 Commenti
Atsushi Ueno
Atsushi Ueno il 12 Nov 2021
Modificato: Atsushi Ueno il 12 Nov 2021
①「~~」とはどういう意味でしょうか?調べたのですが、どういう機能なのか分かりませんでした。
~は論理NOTです。NOTのNOTなので、0以外はtrue、0はfalseになります。コーディング作法としてあまり宜しくないようなので、logical(数字)にした方が良いですね。後ほど回答を修正致します。
②以下の重複率を、再びhist3で表示するにはどうすればよいでしょうか?行列の形式になっているので、これを再びx,yのベクトルにすればよいと思うのですが、その方法が分かりませんでした…。
重複率を表示する際にメッシュで切る必要はないので、surface関数やpcolor関数が適当だと思います。pcolor関数についてはhist3関数の説明にも出てくるので、これを真似して回答を修正致します。
Yu
Yu il 16 Nov 2021
返信が遅くなりましてすみません。
丁寧にご解説くださりありがとうございました!
logicalとpcolor、大変勉強になりました。
おかげさまで目的を達成できました。

Accedi per commentare.

Più risposte (1)

Hernia Baby
Hernia Baby il 11 Nov 2021
Modificato: Hernia Baby il 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 Commento
Yu
Yu il 12 Nov 2021
なるほど、このようにセルに分けてカウントする方法もあるのですね。
参考にさせていただきます!教えてくださりありがとうございます。

Accedi per commentare.

Community Treasure Hunt

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

Start Hunting!