2014-11-23 56 views
0

目前,我需要開發一種算法來解決優化問題總和元素,以獲得對應矩陣

我遇到一個問題關於我的方式來計算設施之間的距離不夠高效。

現在,我給出了矩陣,這是設施的長度。

A = [0.0300  % The left most facility 
    0.0400  % 2nd 
    0.0500  % 3rd 
    0.0200  % 4th 
    0.0600]; % The right most facility 

說,我想找到的兩個設施的中心之間的距離(假設之間沒有間隙),例如:

第二和第五設施的中心之間的距離= 0.0400/2 + 0.0500 + 0.0200 + 0.0600/2 = 0.1200

從這一點,我們可形成矩陣B這是我想要的輸出(可以是對稱的基體還)

B = [0  0.0350 0.0800 0.1150 0.1550 
    0  0  0.0450 0.0800 0.1200 
    0  0  0  0.0350 0.0750 
    0  0  0  0  0.0400 
    0  0  0  0  0]; 

我是儘量避免嵌套爲廁所頁。這是我能想到爲了了get矩陣B.

n = numel(A); 
x = triu(repmat(A,1,n)); 
B = zeros(5); 
x = x - diag(diag(x)/2); 
for i=1:4 
    x(i,:) = x(i,:)/2; 
    y = x; 
    B(i,:) = sum(y); 
    x(i,:) = 0; 
end 
B = B - diag(diag(B)) 

當然,矩陣大小在現實中非常大的最好的,我的方式是不太有效。獲得矩陣B而不是使用for循環有什麼技巧嗎?

回答

1

您可以用不同的方式思考問題 - 實際上,您計算的是每個設施的起點與每個設施的終點之間的距離的平均值。即

  <------start dist------> 
[ A ][ B ][  C  ][   D   ] 
        <--------------end dist--------------> 

可以使用計算出各設施的起點和終點:

end_pts = cumsum(A); 
start_pts = end_pts - A; 

然後可以計算開始和使用結束的距離:

start_dist = abs(bsxfun(@minus,start_pts,start_pts')); 
end_dist = abs(bsxfun(@minus,end_pts,end_pts')); 

你再取這些矩陣的平均值找到中心之間的距離:

B = (start_dist + end_dist)./2;