- 上のマップはデータAの分布を示します
- 下のマップはデータAとデータBが共に存在する区間の分布を示します
点群をメッシュ状に分類してデータ重複を確認したい
4 次查看(过去 30 天)
显示 更早的评论
こんにちは。
添付写真のような、XY平面上の点群データがあります。
これらを例えば10m毎のメッシュに分け、
①データの存在するグリッドと存在しないグリッドの区別
②同じ座標範囲において、異なるデータセットのグリッドの重複率を評価
③可能であれば、グリッド内の点数も反映できると嬉しいです
したいと思っております。
良さそうな方法が見つからず、良いアイディアをお持ちの方がいらっしゃいましたらご教示いただけますと嬉しいです。
宜しくお願いいたします。
0 个评论
采纳的回答
Atsushi Ueno
2021-11-11
编辑:Atsushi Ueno
2021-11-12
二変量ヒストグラムでの解析が良さそうな方法だと思います。
例)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) = [];
3 个评论
Atsushi Ueno
2021-11-12
编辑:Atsushi Ueno
2021-11-12
①「~~」とはどういう意味でしょうか?調べたのですが、どういう機能なのか分かりませんでした。
~は論理NOTです。NOTのNOTなので、0以外はtrue、0はfalseになります。コーディング作法としてあまり宜しくないようなので、logical(数字)にした方が良いですね。後ほど回答を修正致します。
②以下の重複率を、再びhist3で表示するにはどうすればよいでしょうか?行列の形式になっているので、これを再びx,yのベクトルにすればよいと思うのですが、その方法が分かりませんでした…。
重複率を表示する際にメッシュで切る必要はないので、surface関数やpcolor関数が適当だと思います。pcolor関数についてはhist3関数の説明にも出てくるので、これを真似して回答を修正致します。
更多回答(1 个)
Hernia Baby
2021-11-11
编辑:Hernia Baby
2021-11-11
まずはテキトーに整数のデータでも作ります
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)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 三角分布 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!