- 上のマップはデータAの分布を示します
- 下のマップはデータAとデータBが共に存在する区間の分布を示します
点群をメッシュ状に分類してデータ重複を確認したい
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
こんにちは。
添付写真のような、XY平面上の点群データがあります。
これらを例えば10m毎のメッシュに分け、
①データの存在するグリッドと存在しないグリッドの区別
②同じ座標範囲において、異なるデータセットのグリッドの重複率を評価
③可能であれば、グリッド内の点数も反映できると嬉しいです
したいと思っております。
良さそうな方法が見つからず、良いアイディアをお持ちの方がいらっしゃいましたらご教示いただけますと嬉しいです。
宜しくお願いいたします。
0 commentaires
Réponse acceptée
Atsushi Ueno
le 11 Nov 2021
Modifié(e) : Atsushi Ueno
le 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) = [];
3 commentaires
Atsushi Ueno
le 12 Nov 2021
Modifié(e) : Atsushi Ueno
le 12 Nov 2021
①「~~」とはどういう意味でしょうか?調べたのですが、どういう機能なのか分かりませんでした。
~は論理NOTです。NOTのNOTなので、0以外はtrue、0はfalseになります。コーディング作法としてあまり宜しくないようなので、logical(数字)にした方が良いですね。後ほど回答を修正致します。
②以下の重複率を、再びhist3で表示するにはどうすればよいでしょうか?行列の形式になっているので、これを再びx,yのベクトルにすればよいと思うのですが、その方法が分かりませんでした…。
重複率を表示する際にメッシュで切る必要はないので、surface関数やpcolor関数が適当だと思います。pcolor関数についてはhist3関数の説明にも出てくるので、これを真似して回答を修正致します。
Plus de réponses (1)
Hernia Baby
le 11 Nov 2021
Modifié(e) : Hernia Baby
le 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)
Voir également
Catégories
En savoir plus sur 三角分布 dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!