位置矩阵和每个位置的距离

时间:2012-08-06 10:32:02

标签: matlab

我创建了一个我很满意的位置矩阵,对于这个矩阵的每个位置(或元素),我想计算矩阵中所有其他位置之间的位置距离。通过这种方式,我可以获得彼此元素来自另一个元素的方向。我试图通过以下方式做到这一点:

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)似乎只存储最后的计算(即所有单元格都是空的,除了最后一个单元格,它保存位置矩阵上最后一个位置的正确信息)。我在哪里错了?此外,如果有更有效的方法,那么我想知道,因为我知道存储和访问单元格数会减慢程序的速度。

3 个答案:

答案 0 :(得分:1)

这些陈述在循环结束时对j做了什么?

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

在我阅读您的代码时,这些代码始终将v(length(pos))设置为{vecdir},然后将1添加到ii的更新值在下一轮内循环重置(1)之前从未使用过。

我不能说你的其他代码都没问题,我不确定我是否完全按照你的问题,但这些有点腥味。

答案 1 :(得分: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

答案 2 :(得分: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);