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

4

3 回答 3

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
于 2012-08-06T11:49:44.750 回答
1

这些语句在循环结束时在做什么j

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

当我阅读您的代码时,这些总是设置v(length(pos)){vecdir}然后添加1i. 这个更新的值在下一次循环内部循环i被重置(到)之前从未使用过。1

我不能说您的其余代码都可以,我不确定我是否完全遵循您的问题,但是这些位闻起来有点可疑。

于 2012-08-06T11:00:07.473 回答
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);
于 2012-08-06T12:12:15.320 回答