【问题标题】:Position matrix and distance from each position位置矩阵和到每个位置的距离
【发布时间】:2012-08-06 20:12:15
【问题描述】:

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

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

【问题讨论】:

    标签: matlab


    【解决方案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
    

    【讨论】:

    • 感谢 Gunther - 这正是我想要的。
    【解决方案2】:

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

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

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

    我不能说你的代码的其余部分没问题,我不确定我是否完全按照你的问题,但这些位闻起来有点腥。

    【讨论】:

    • 是的,我看到 i = i+1 如何删除以前的存储。谢谢马克。
    【解决方案3】:
    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多