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