3

次の行列 a は、from-to 距離を表します。

a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];

a =

 0     3     5     6
 4     0     2     9
 9     1     0     4
 8     3     8     0

(つまり、2 から 4 まで = 9、1 から 2 まで = 3 など)

行列aは静的 (変化しない) であり、変化する別の行列bがあります。入力例は次のとおりです。

b = [1; 4; 2; 1; 3; 4; 1];

b =

 1
 4
 2
 1
 3
 4
 1

私は最初の行と2番目の行の間の距離を見つけようとしています-そして、出力するすべての行に対してそのタスクを実行します:

b =

 1  
 4  6
 2  3
 1  4
 3  5
 4  4
 1  8

2 番目の列は、行列aから取得した値です。

4

1 に答える 1

2

ここに一行の解決策があります:

%#Set parameters of problem
a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];
b = [1; 4; 2; 1; 3; 4; 1];
aSize = size(a);

%#The one-line solution 
Soln = [b, [NaN; a(sub2ind(aSize, b(1:end-1), b(2:end)))]];

または、ベクトル化されていないソリューションは次のとおりです。

%#Set parameters of problem
a = [0 3 5 6; 4 0 2 9; 9 1 0 4; 8 3 8 0];
b = [1; 4; 2; 1; 3; 4; 1];
T = length(b);

%#Preallocate a distance vector
bDist = NaN(T, 1);

%#Loop over b getting the distance for each pair
for t = 2:T
    bDist(t, 1) = a(b(t-1), b(t));
end

%#Combine b and bDist into a single matrix.
Soln = [b bDist];

では、どのソリューションが最適でしょうか? 私のマシン (R2012b、Linux Mint v12) では、 の転換点の長さbは約 650 です。bが 650 より大きい場合は、ベクトル化されたソリューション (つまり、ワンライナー) を使用します。bが 650 より小さい場合は、ループを使用します。

ちなみに、1 行のソリューションは、関数を使用して、連続するペアbを行列の行インデックスと列インデックスに変換することで機能します。次に、これらのインデックスを使用してインデックスを作成することにより、解ベクトルが見つかります。asub2inda

ps非対称距離行列?面白い問題ですね!

于 2012-11-05T00:13:39.407 に答える