2

正方行列を作成したい。ノードと呼ばれるこの行列があるとしましょう

1 4.3434  3.4565
2 6.2234  5.1234
3 10.4332 2.3243
4 7.36543 1.1434

ここで、列2と3は、ノードnの位置xとyを表します。

そして、その要素がノード行列のいくつかの要素であるヘッドと呼ばれる行列

2 6.2234 5.1234
3 10.4332 2.3243

この関数を作成して、ヘッドからすべてのノードの距離の行列を作成しました

function [distances] = net_dist(nodes,heads)
nnodes = length(nodes(:,1));
distances = zeros(nnodes);
for i = 1 : nnodes
    for j = 1 : nnodes
        if nodes(i,1) == nodes(j,1) && ismember(nodes(j,1),heads(:,1))
            distances(i,j) = sqrt((nodes(i,2) - nodes(j,2))^2 + (nodes(i,3) - nodes(j,3))^2);
        elseif (nodes(i,1) == nodes(j,1) || nodes(i,1) ~= nodes(j,1)) && ismember(nodes(j,1),heads(:,1))
            distances(i,j) = sqrt((nodes(i,2) - nodes(j,2))^2 + (nodes(i,3) - nodes(j,3))^2); 
        elseif (nodes(i,1) == nodes(j,1) || nodes(i,1) ~= nodes(j,1)) && ~ismember(nodes(j,1),heads(:,1))
            distances(i,j) = 1E9;
        end
    end
end
return;

この関数は、ヘッドからすべてのノードの距離を返す必要があります。ヘッドではないノード間の位置は、番号1E9で埋められます。sqrt値を受け取る代わりにこの関数を実行すると、すべて0を受け取る理由がわかりません。

間違いなく私はそのような同様のものを手に入れるでしょう

   1   2   3   4 
 1 1E9 d   d   1E9
 2 1E9 0   d   1E9
 3 1E9 d   0   1E9
 4 1E9 d   0   1E9
4

1 に答える 1

3

あなたはゼロを取得しません、あなたは正しい距離を取得します。1e9は大きな値であり、行列を印刷しようとすると、次のようになるため、おそらくゼロになると思います。

distances =

1.0e+09 *

1.0000    0.0000    0.0000    1.0000
1.0000         0    0.0000    1.0000
1.0000    0.0000         0    1.0000
1.0000    0.0000    0.0000    1.0000

2つの0エントリが真のゼロであるのに対し、他の0エントリはコマの後の約0から4桁であることがわかります。行列要素の1つを印刷して、それらがゼロではないことを確認してください

distances(1,2)

ans =

2.5126

関数を使用nnzして、ゼロ以外の数をすばやく知ることもできます

nnz(distances)

ans =

14
于 2012-09-24T08:35:02.000 に答える