2017-05-08 10 views
0

と一致した場合、私は完璧に動作し、以下の機能を持っていますが、私はそれにベクトル化を適用したいと思います...ベクトル化ロジック指数は

for i = 1:size(centroids,1) 
    centroids(i, :) = mean(X(idx == i, :)); 
end 

そのインデックスに対応するすべてのXの値に対して、meanの値を計算します。

これはベクトル化での私の試みである、コードを壊しidx == [1:size(centroids,1)]次のように私の解決策は動作しませんし、私はなぜ...

centroids = mean(X(idx == [1:size(centroids,1)], :)); 

を知っています。 idx1からsize(centroids,1)までの数字のいずれかと等しいかどうかをチェックする方法はわかりません。

TL:drは

あなたが細胞内に行列を分割し、その内側の操作でループを適用する(cellfunを使用して、各セルからの平均値を取ることができ、ベクトル

+0

Xベクトルの例を与えることができます – anyanwu

+1

実際にはforループはここでは冗長です。 idxの値はiと1回だけ等しくなります。あなたは 'centroids(idx、:) = mean(X(idx、:));'を達成するためにこの行を使うことができます。しかし、あなたの質問から明らかではない別の何かをしたい場合は、 'X 'の値の例と' centroid'のための望ましい出力を提供する必要があります – anyanwu

答えて

2

をループのために取り除きます):

データを生成します。

dim = 10; 
N = 400; 
nc = 20; 
idx = randi(nc,[N 1]); 
X = rand(N,dim); 
centroids = zeros(nc,dim); 

は、トイレを使用することを意味しますP(質問の方法)

for i = 1:size(centroids,1) 
    centroids(i, :) = mean(X(idx == i, :)); 
end 

ベクトル化:方法間

% split X into cells by idx 
A = accumarray(idx, (1:N)', [nc,1], @(i) {X(i,:)}); 
% mean of each cell 
C = cell2mat(cellfun(@(x) mean(x,1),A,'UniformOutput',0)); 

最大絶対誤差:

max(abs(C(:) - centroids(:))) % about 1e-16 
+0

申し訳ありません、私は私のことを投稿した。あなたが最初に答えたように、あなたのためにアップアップされました。 – souty

+0

これは似ていますが、似ていますが同一ではないため、さまざまな回答があることをお勧めします。 – user2999345

3

1つのオプションは、arrayfunを使用することです。

nIdx  = size(centroids,1); 
centroids = arrayfun(@(ii) mean(X(idx==ii,:)),1:nIdx, 'UniformOutput', false); 
centroids = vertcat(centroids{:}) 

単一の関数呼び出しの出力は必ずしもスカラーではないので、UniformOutputオプションがfalseに設定されなければなりません。したがって、arrayfunはセル配列を返し、希望するdouble配列を取得するにはvertcatする必要があります。

+0

'arrayfun'は、明示的なループとほぼ同じ性能を持ちます。それは実際にベクトル化としてカウントされません –

+0

まあ、arrayfunは、組み込み関数、つまり、事前にコンパイルされています。私の経験では、明示的なループよりも優れたパフォーマンスを提供します。 – souty

+0

特定のケースとMatlabのバージョンによって異なりますが、一般的に 'arrayfun' [is](https://es.mathworks.com/matlabcentral/answers/324130-is-arrayfun-faster-much-more-than- for-loop)(または[used](http://es.mathworks。com/matlabcentral/newsreader/view_thread/260563)になる)[遅い](http://stackoverflow.com/questions/12522888/arrayfun-can-be-significant-slower-than-an-explicit-loop-in-matlab -なぜ) –

関連する問題