accumarray
2 行のインデックスを使用して、指定された関数によって割り当てられた値を持つ有効なインデックス ペアの位置に要素を持つ行列を作成します。たとえば、次のようになります。
A = [11:20];
B = flipud([11:20]);
C = 1:10;
datamatrix = accumarray([A B],C);
この方法datamatrix
は20x20
、値を持つマトリックスになります。A
ただし、との値B
が非常に大きい場合、ほとんどが空の行列になり、端の隅に小さなデータのバッチができます。これを回避するには、次のように設定accumarray
しissparse
ます。
sparsedatamatrix = accumarray([A B],C,[],@sum,[],true);
min(A)
これにより、非常に大きい場合や非常に大きい場合に、多くのメモリが節約されますmin(B)
。
しかし、私の問題は、最初の 2 列のインデックスに基づいて列 3 から 7 の平均を収集し、3 番目の列に基づいて 3 番目の列の標準偏差を収集したいのMx7
行列があることです。M~1e8
result = accumarray([data(:,1) data(:,2)],data(:,3),[],@std);
これを次のように構造化されたテーブルに保存したいと思います[X Y Z std R G B I]
。 ここで、X
とY
はインデックス、Z
はそのピクセルの平均高さ、 、 はR
ピクセルG
あたりの平均値 (色と強度)、B
は高さの標準偏差 (つまり、粗さ)。を使用して得られた行列を変換するため、この場合に を使用しても役に立ちません。I
std
issparse
accumarray
repmat
このコードのポイントは、点群から土地の高さ、粗さ、色、強度を推定することです。X と Y の座標を丸めてグリッドを作成し、グリッド セルごとにこれらの平均値が必要になりましたが、「テーブル」として出力します (MATLAB データ型ではなく、既定のマトリックス出力ではない 2D 配列)。
したがって、質問を締めくくるには:
accumarray
中間の(潜在的に非常に大きな)マトリックスなしでこのテーブルを出力する方法または同様の関数はありますか?
以下のコード:
Xmax = max(Originaldata(:,1));
Ymax = max(Originaldata(:,2));
X_avg_grid=(Edgelength:Edgelength:Xmax*Edgelength)+Xorig;
TestSet = zeros(Xmax*Ymax,9);
xx = [1:length(X_avg_grid)]'; %#ok<*NBRAK>
TestSet(:,1) = repmat(xx,Ymax,1);
ll = 0:Xmax:Xmax*Ymax;
for jj = 1:Ymax
TestSet(ll(jj)+1:ll(jj+1),2) = jj;
end
for ll = 1:7
if ll == 2
tempdat = accumarray([Originaldata(:,1) Originaldata(:,2)],Originaldata(:,3),[],@std);
tempdat = reshape(tempdat,[],1);
TestSet(:,ll+2) = tempdat;
elseif ll == 7
tempdat = accumarray([Originaldata(:,1) Originaldata(:,2)],1);
tempdat = reshape(tempdat,[],1);
TestSet(:,ll+2) = tempdat;
elseif ll == 1
tempdat = accumarray([Originaldata(:,1) Originaldata(:,2)],Originaldata(:,3),[],@mean);
tempdat = reshape(tempdat,[],1);
TestSet(:,ll+2) = tempdat;
else
tempdat = accumarray([Originaldata(:,1) Originaldata(:,2)],Originaldata(:,ll+1),[],@mean);
tempdat = reshape(tempdat,[],1);
TestSet(:,ll+2) = tempdat;
end
end
TestSet = TestSet(~(TestSet(:,9)==0),:);
ここの 9 列目は、セルあたりのポイント数です。
Originaldata =
19 36 2.20500360107422 31488 31488 31488 31611
20 37 2.26400360107422 33792 33792 34304 33924
20 37 2.20000360107422 33536 33536 34048 33667
19 36 2.20500360107422 34560 34560 34560 34695
20 36 2.23300360107422 32512 32512 33024 32639
21 38 2.22000360107422 31744 31488 33024 31611
21 37 2.20400360107422 32512 32768 33792 32896
21 37 2.24800360107422 29696 29440 30720 29555
21 38 2.34800360107422 32768 32768 32768 32639
21 37 2.23000360107422 33024 33024 33536 33153
したがって、同じ X、Y (例:[19 36]
または[21 37]
) 上のすべてのポイントが平均化され (高さ、RGB、強度の順で)、3 番目の列の値の標準偏差も求められます。
Result =
19 36 2.2050036 0.00 33024 33024 33024 33153
21 37 2.227336934 0.02212088 31744 31744 32682.66 31868
残りのデータについても同様です。
コードを最新バージョンに更新しました。これにより、関数がグリッドを一度に作成するのではなく、次々に作成するようになったため、メモリのオーバーヘッドが大幅に削減されました。ただし、コードは並行して実行されているため、まだ 8 つの同時グリッドが作成されているため、解決策があれば幸いです。