2016-12-15 49 views
0

我想要計算結構數據類型的距離。結構數據分配

的距離的方法是:

function ssd=distances(x, c) 
    m=size(x,1); 
    ssd = zeros(m, k); 
    k=size(c,1); 

    for i= 1:k 
    z = bsxfun(@minus,x, c(i,:)); 
    ssd(:,i) = sqrt(z(:).^2,2); 
end 

然後,我有c這是從下面的公式產生的隨機數:

for i=1:20 
    pop(i).Position=unifrnd(2,2,4); 
    pop(i).dist=distances(x= data,pop(i).Position=c); 
end 

X =數據100X2。

問題是當我調用distance方法時,它不接受傳遞的參數pop(i).position

+0

哪個參數?另外,你正在使用一個變量'k',這個變量在我看不到的地方沒有定義。請編輯你的問題來澄清。 –

+0

爲什麼你的函數調用中有'x ='和'= c'?那麼距離(數據,流行(i)。位置)呢? – Suever

+0

@Suever,是的,它只是解釋x是數據,c是pop(i).position –

回答

0

幾個錯誤,並建議我可以做:

  1. sqrt功能只接受單一輸入參數。您正在指定兩個輸入參數。

  2. 你也沒有計算SSD的權利。當您執行z = bsxfun(...);時,您只需計算data與輸入查詢點c(i, :)之間的分量距離。你必須總和所有組件的距離以及。這可能是爲什麼你sqrt函數調用是錯誤的,因爲你很可能意味着,除了添加sumsqrt還有:

    ssd(:, i) = sqrt(sum(z.^2, 2)); 
    

    BTW,平方差之和傳統不包括sqrt操作....這就是爲什麼它的名稱爲總和正方形的差異。

  3. 而且這個代碼在你的主循環沒有任何意義:

    pop(i).dist=distances(x= data,pop(i).Position=c) 
    

    我的猜測是,你從一個Python的背景,你可以指定輸入,鍵值對的到來。不要這樣做。只要做到:

    pop(i).dist = distance(data, pop(i).Position); 
    
  4. 此代碼pop(i).Position=unifrnd(2,2,4);將產生的2和2的值......這沒有任何意義之間的4×4矩陣。您可能想要生成一個4 x 2矩陣以匹配您的數據所具有的功能數量。使用別的東西,使隨機數的範圍更大。爲了得到這個4 x 2指定一個額外的參數。像這樣的東西可以工作:

    pop(i).Position = unifrnd(2, 10, 4, 2); 
    
+0

我做您的建議進行修改,但仍然有使用bsxfun兩個輸入數組的 非單身的尺寸必須相互匹配錯誤錯誤。 –

+0

z = bsxfun(@ minus,x,c(i,:)); –

+0

檢查編輯。特別是#4。你對'unifrnd'的調用根本沒有意義。 – rayryeng