2015-09-06 60 views
1
  1. 可以說我有一個數組x的數據值。
  2. 我執行了一種聚類算法,該算法已生成帶有標籤名稱的標籤貼圖 - labelMap。數據中的每個點現在都有一個與之關聯的唯一羣集標籤。
  3. 然後我在每個子集上執行函數foo(subset,secondArg)。函數foo返回一個新數組,其結果與給定參數(其map()函數也接收第二個參數)的大小相同。

以下是當前實現:使這個matlab代碼運行沒有for循環

x = rand(1,1000); 
    numClusters = 3; % specified in advance by the user, for example using a clustering algorithm such as K-Means, this is a given. 
    fooSecondArg = [1,2,3]; % second argument for foo(). 

    labelMap = kmeans(x,numClusters); 
    res = zeros(size(x)); 

    %% make me run without a for loop :) 
    for ind = 1:numClusters 
     res(labelMap == ind) = foo(x(labelMap == ind), fooSecondArg(ind)); 
    end 

我的問題如下:

,因爲在X FOO(指數之間沒有重疊)作用於,是有辦法不使用for或parfor循環來執行foo而不使用x? (我不想使用parfor循環,因爲它需要很長時間才能啓動額外的matlab進程,並且我以後不能將其部署爲獨立應用程序)。

非常感謝!

編輯: 我被要求提供一個foo()的例子,因爲我被告知解決方案可能取決於它。一個好的可行的例子,你可以在你的答案中使用:

function out = foo(x,secondArg) 
    out = x.^2/secondArg; 
+1

我不認爲有一種自動方式(您可以嘗試'accumarray'與一個匿名函數返回一個單元格數組,但必須更慢)。這完全取決於'foo'在內部的作用 –

+0

擬合foo(x,secondArg)的一個例子可能是:return out = x。^ 2/secondArg – user2324712

+0

這個'secondArg'如何依賴於集羣標籤?你有從集羣標籤到'secondArg'的某種映射嗎? –

回答

1

是否可以刪除循環取決於你有的功能。你的情況的功能是

function out = foo(x,secondArg)
out = x.^2/secondArg;

其中secondArg取決於羣集。

對於這個功能(以及類似的),你的確可以消除環路如下:

res = x.^2 ./ fooSecondArg(labelMap); 

這裏

  • labelMapx(同樣大小指示集羣標籤每個x);
  • fooSecondArg是長度等於簇數的向量(表示每個簇的第二個參數)。

因此fooSecondArg(labelMap)是數組大小相同的x,這對於每個點給出對應於該點的集羣的第二個參數。運營商./執行元素劃分以產生期望的結果。