0

3 列の形式 [x、y、z] で編成された 3D 点群があり、列 4 以降の各点の追加のプロパティがあります。すべてのポイントの距離はランダムであることに注意してください。z に沿ってデータを「平坦化」し、ボリューム内の点群の特定のプロパティを平均化するサイズ y、x の 2D マトリックスを作成するために、blockproc に似た移動フィルターを実装しようとしています。ボリュームは、x と y に沿った固定サイズのカーネルである必要があります。それらを dx と dy と呼びましょう。その中で任意の z の値が取得されます。さらに、ボリュームはスライドできる必要があるため、たとえば、移動ステップ (xStep および yStep と呼びましょう) は必ずしも dx および dy と同じではありません (dx=dy および xStep=yStep ですが)。

これまでのところ、私が見つけたMatlab関数は次のとおりです。

blockproc : スライディング カーネルを実装する機能がありますが、行列で動作します

accumarray : 離散点で動作しますが、スライディング カーネルは動作しません

3D ポイントと移動ブロック これは、私が概念的にやろうとしていることの漫画です。この関数は赤い点をキャプチャし、関数 (平均、標準偏差など) を適用して赤いセルの値を計算する必要があります。次に、xStep で移動し、関数を再適用します。

どうすればそれを達成できるか考えていますか? 私はしばらくそれで立ち往生しています。各反復でポイントにインデックスを付ける関数を作成しましたが、データセットがかなり大きい (>10^7 ポイント) ため、このアプローチには非常に時間がかかります。このスレッドは、スライディング カーネルなしで accumarray を使用して MWE を提供します。

table = [ 20*rand(1000,1) 30*rand(1000,1) 40*rand(1000,1)]; % random data
x_partition = 0:2:20; % partition of x axis
y_partition = 0:5:30; % partition of y axis
L = size(table,1);
M = length(x_partition);
N = length(y_partition);
[~, ii] = max(repmat(table(:,1),1,M) <= repmat(x_partition,L,1),[],2);
[~, jj] = max(repmat(table(:,2),1,N) <= repmat(y_partition,L,1),[],2);
% Calculate the sum
result_sum = accumarray([ii jj], table(:,3), [M N], @sum, NaN);

どんな入力でも大歓迎です、ありがとう! PS: 初投稿です。書式設定が間違っていたらごめんなさい

4

0 に答える 0