我创建了一个我很满意的位置矩阵,对于这个矩阵的每个位置(或元素),我想计算矩阵中所有其他位置之间的位置距离。通过这种方式,我可以获得彼此元素来自另一个元素的方向。我试图通过以下方式做到这一点:
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)似乎只存储最后的计算(即所有单元格都是空的,除了最后一个单元格,它保存位置矩阵上最后一个位置的正确信息)。我在哪里错了?此外,如果有更有效的方法,那么我想知道,因为我知道存储和访问单元格数会减慢程序的速度。
答案 0 :(得分:1)
这些陈述在循环结束时对j
做了什么?
v(i) = {vecdir};
i = i+1;
在我阅读您的代码时,这些代码始终将v(length(pos))
设置为{vecdir}
,然后将1
添加到i
。 i
的更新值在下一轮内循环重置(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);