私はある種の補間アルゴリズムを実装しようとしています。 I
はN * 4の行列であり、周囲の点のインデックスをN
の他の点で保持します。しかし、各行の要素がI
である場合は、一意ではない可能性があります。つまり、2つ以上が個別のポイントを参照する可能性があります。各行でどれだけユニークなインデックスが利用できるかを知りたいのですが、N
が大きいので、できるだけ早くそれをやりたいのです!行列の各行に固有の要素の数を見つける方法は?
2
A
答えて
1
まあ、Mohsen's answerはこの問題の一般的な解決策ですが、arrayfun
は私にとっては遅すぎました。だから私はそれについてもう少し考え、はるかに速い解決策を見つけました。 私は、列のすべてのペアを比較し、それらが等しかった場合、カウンタを増やす:
tic;
S = zeros(N, 1, 'uint32');
Nu = S+4; % in my case most of point are surrounded by four different points
for i=1:3
for j=(i+1):4
S = S + uint32(I(:, i)==I(:, j));
end
end
% Nu(S==0) = 4;
Nu(S==1) = 3;
Nu((S==2)|(S==3)) = 2; % why? :)
Nu(S==6) = 1;
toc;
はN=189225
について、arrayfun
は私のPC上で14.73sかかりますが、合計は0.04sかかります。
編集:ここでは、上記のコードの変更の列
の異なる数の世話をします。今度は、各行にユニークな値の場所を持つこともできます。これには:)
の問題がなく、より多くの列に使用できます。私のPCで189225行の0.04秒をとりました。
tic;
uniq = true(N, 4);
for i=1:3
for j=(i+1):4
uniq(I(:, i)==I(:, j), j) = false;
end
end
Nu = sum(uniq, 2);
toc;
編集(2):私は列の数が異なる行列の各行のユニークな要素の数を望んでいた別の問題のためにこれを必要しばらくEBHのanswer
との比較。そこで私のコードとEBHのコードを比較して、コードが高速かどうかを調べました。 3つの異なる実行の(秒)費やした時間の平均Iが6〜60の結果から、両方の10Kから100Kの行を持つマトリックス上のコード、および列を走っている:私はこれをテストしてい
MATLABの最新バージョンではforループのパフォーマンスが大幅に改善されています。古いバージョンで実行したい場合は、自分で比較する必要があるかもしれません。ここで
2
は、各列にunique
関数を使用し、結果の要素をカウントする必要があります
arrayfun(@(x) numel(unique(I(x,:))), (1:size(I,1)).')
結果が列ベクトルになるようにインデックス配列を転置されます。
1
はループせずにこれを行うには、超高速な方法です:
accumarray(repmat(1:size(I,1),1,size(I,2)).',I(:),[],@(x) numel(unique(x)))
これはあなたの場所kの要素がI(k,:)
でユニークな要素の数であるベクトルの大きさNを、提供します。
関連する問題
- 1. 行列の各列の最初の非負要素のインデックスを見つける
- 2. sqlクエリで行列要素を見つける方法は?
- 3. 行列の各列にベクトルで要素を掛ける方法Theanoでは?
- 4. 3D MATLAB行列の最大要素の位置を見つける方法は?
- 5. 配列の各要素の最も近い値を見つける方法は?
- 6. 各ループ内の要素のクラスを見つける方法
- 7. Pythonの行列(リストのリスト)の特定の要素を見つける方法
- 8. 各要素に固有のテキストを付ける
- 9. 行列から固有ベクトルを見つける
- 10. 固有値:三角行列を見つける
- 11. MATLAB行列の要素を見つけるための効率的な方法
- 12. スレッシュホールドより小さいマトリックスの各行の要素の数を見つける方法
- 13. 行列の各行を別の行列の各要素に連結するR
- 14. 行列内の要素の近傍を見つける?
- 15. 行列の固有値を行列要素のプロットとしてプロットする
- 16. sasで要素ごとに別の行列の各行に各行を乗算する方法は?
- 17. 行列のリストの各要素のパーセンタイルを得る方法
- 18. 固定要素を持つシンボリック行列
- 19. ArrayList内の同じ要素をグループ化し、各固有要素の数を取得する方法は?
- 20. 大きな行列の行列式を見つける方法
- 21. 実行時にboost :: fusion :: vectorの要素を見つける方法は?
- 22. すべての固有行列要素に関数を適用する
- 23. 行列の主対角に平行な要素を見つける
- 24. R - 各列の連続する行の違いを見つける方法
- 25. 配列の最小要素と最大要素を見つける方法は?
- 26. 素早く配列から行を見つける方法
- 27. Rでは、各サブテストの相関行列を見つける
- 28. 配列の各要素をテーブルの行 - テーブルのデータに入れる方法は?
- 29. 固有値における外部行主要行列の転置を計算する方法
- 30. Numpyは2次元配列行の1d配列要素を見つける
私の答えを確認してください。 mamnoon misham;) – saastn
一意の要素としてゼロを考慮しないように、上記の構文をどのように編集するのですか? – Sade
'setdiff(I(x、:)、0)に' unique(I(x、:)) 'を変更します。 –