2012-08-06 118 views
1

我已經創建了一個我很滿意的位置矩陣,並且對於矩陣的每個位置(或元素),我想計算矩陣中所有其他位置之間的位置距離。這樣我就可以從另一個元素獲取方向。我試圖按照以下方式做到這一點:位置矩陣和每個位置的距離

pos = [X(:),Y(:),Z(:)]; 

for j = 1:length(pos) 
for i = 1:length(pos) 
    vecdir(i,:,:) = pos(i,:,:) - pos(j,:,:); 
end 
    v(i) = {vecdir}; 
    i = i+1; 
end 

其中每個單元格保存位置矩陣中每個位置的位置距離。 v(i)似乎只存儲最後的計算(即,除了最後一個單元,所有單元都是空的,它保存位置矩陣上最後一個位置的正確信息)。我在哪裏錯了?另外,如果有更高效的方法做這個,那麼我想知道,因爲我知道存儲和訪問單元陣列減慢了很多程序。

回答

1

他們總是pdist2

dist = pdist2(pos,pos); 

這給距離向量的常態。

如果還需要的距離矢量我會使用這樣的:

N = size(pos,1); 
v = arrayfun(@(ii) bsxfun(@minus,pos,pos(ii,:)),1:N,'uni',false) 

它返回一個Nx1單元陣列,含有pos(ii,:)到另一位置的距離向量中的每個小區。

你的代碼似乎也是這樣做的,儘管有一些錯誤;我想你打算做到以下幾點:

N = size(pos,1); 
v = cell(N,1); 
for j = 1:N 
    for i = 1:N 
     vecdir(i,:) = pos(i,:) - pos(j,:); 
    end 
    v{j} = vecdir; 
end 
+0

感謝Gunther--這正是我所期待的。 – brucezepplin 2012-08-06 12:14:40

1

這些陳述在j循環結束時做了什麼?

v(i) = {vecdir}; 
i = i+1; 

當我讀到你的代碼,這些始終設置v(length(pos)){vecdir},然後添加到1i。這個更新後的值i從未被重置之前使用(到1)在內循環下一輪。

我不能說你的代碼的其餘部分是好的,我不知道我完全按照你的問題,但這些位聞起來有點腥。

+0

是的,我怎麼看i = i + 1刪除之前的存儲。謝謝馬克。 – brucezepplin 2012-08-06 12:15:40

0
x = repmat(X(:), 1, numel(X)); 
y = repmat(Y(:), 1, numel(Y)); 
z = repmat(Z(:), 1, numel(Z)); 

dst = sqrt((x - x') .^ 2 + (y - y') .^ 2 + (z - z') .^ 2);