1

コードの背後にある考え方を簡単に説明してから、問題を掘り下げます。

データを収集しています。最初の 2 つの列は経度と緯度の座標になり、3 番目の列は GPS 信号強度になります。

それぞれが異なる衛星に対応する 2 つの行列があります。最初の行列の x,y 座標を使用して、2 番目の行列の TriScatteredInterp 関数を使用して信号強度を補間しました (逆も同様です)。アイデアは、さまざまな場所の推定信号強度を作成し、ある種の超ドローネ三角形分割を取得することです。

私はこれまでのところすべてをやり遂げることができました。(この時点で私と一緒にいてくれてありがとう)。

私が今やりたいことは、2 つの行列 (補間されたデータで構成される) を 1 つの行列に結合することです。long 座標と lat 座標が同じ場合、つまり、列 1 と 2 の最初の 2 つの値が他のマトリックスと同じである場合、信号強度を行の 4 列目に追加したいと思います。緯度と経度の値が異なる場合、新しいマトリックスに新しい行を作成してデータを追加したいと考えています。質問を編集し、質問の最後に希望の回答を添付しました。(-明確にするためにこのセクションを編集)

私は完全に困惑しており、あなたが与えることができるどんな助けにも感謝します. 有益な情報を求めてかなり広範囲に検索しましたが、運が悪かったです。

いくつかの問題があり、これが最も複雑であるため、すべての問題を投稿するかどうかはわかりませんでした. 1つだけ投稿することにしました。誰かがさらに質問する際のエチケットを教えていただければ幸いです。私はここに新しいです。

私の長文の質問を読んでいただきありがとうございます。これ以上簡潔にできなかったことをお詫びします。

あなたが与えることができるどんな助けにも感謝します. サム

x = [1, 3, 5, 2, 4, 5, 3, 1, 2, 3, 4, 5;                %I wanteed to make an array that kind of made sense
1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 3, 4;                 %Using random values became kind of difficult
20, 40, 10, 50, 80, 60, 80, 40, 50, 50, 70, 20]';   

y = [0, 2, 4, 1, 2.5, 4, 2, 0, 1, 2, 3, 4;                 
2, 2, 2, 3, 4, 4, 4, 4, 5, 5, 4, 5;                 
10, 30, 20, 40, 70, 80, 90, 30, 60, 40, 80, 20]';

dt1 = DelaunayTri(x(:,1), x(:,2)); %This makes the dt for the x array
dt2 = DelaunayTri(y(:,1), y(:,2)); 

interp1 = TriScatteredInterp(x(:,1), x(:,2), x(:,3)); %I can use the dt to do this as below
interp2 = TriScatteredInterp(dt2, y(:,3));   %use the dt array here like so

newValuesforY = interp1(y(:,1), y(:,2)); %This line uses the interpretation function of the DT for x, to predict values at the y co-ords that I enter.
yNew = [y newSSforY];

newSSforX = interp2(x(:,1), x(:,2));
xNew = [x newSSforX];
xNew(:,[3,4])=xNew(:,[4,3]); %I swap these around for clarity

%I now wish to merge the two, as mentioned in the above post. 

私が求めている答えを追加しました:

0   2   10  NaN
0   4   30  NaN
1   1   NaN 20
1   3   40  40
1   5   60  NaN
2   2   30  50
2   4   90  50
2   5   40  NaN
2.5 4   70  57.5
3   1   NaN 40
3   3   52.5    80
3   4   80  65
3   5   30  50
4   2   20  80
4   3   50  70
4   4   80  46.66666667
4   5   20  NaN
5   1   NaN 10
5   3   NaN 60
5   4   NaN 20

このことから、緯度と経度が同じ重複データを破棄し、newSSforY と newSSforX の 2 つの配列を 1 つの配列にマージしました。

4

2 に答える 2

0

わかりましたので、MATLAB でどのように動作するかを次に示します。

function temp=n_merge(A,B)
%Assumption 1:long, lang coordinates do not repeat within matrix A
%Assumption 2:long, lang coordinates do not repeat within matrix B

%Creating output matrix (over-allocating size)
temp=[A;zeros(size(B,1),3)];
temp=[temp zeros(size(temp,1),1)];

%Initializing variables for for-loop
counter=1;
sp=size(A,1);%starting point

for i=1:size(B,1)
for j=1:size(A,1)
b(j,:)=B(i,1:2)==A(j,1:2);
end
b=sum(b,2);

if isempty(find(b==2))%if the long,lang coordinates are not in matrix A
temp(sp+counter,1:3)=B(i,1:3);
counter=counter+1;

else %if the long,lang coordinates are in matrix B
temp(find(b==2),4)=B(i,3);
end
end

%Removing all rows with 0's on them
temp(all(temp==0,2),:)=[];
于 2013-02-24T20:01:42.693 に答える
0

したがって、私はあなたの質問、特に「さまざまな列に沿って信号強度を追加します。それらが異なる場合は、新しい行を作成したい」という部分を 100% 理解したとは言えません。

2 つの行列 x と y を指定して、次の行列を吐き出す小さなスクリプトを作成しました。

1.00000    1.00000   20.00000    0.00000
3.00000    1.00000   40.00000    0.00000
5.00000    1.00000   10.00000    0.00000
2.00000    2.00000   50.00000   30.00000
4.00000    2.00000   80.00000   20.00000
5.00000    3.00000   60.00000    0.00000
3.00000    3.00000   80.00000    0.00000
1.00000    3.00000   40.00000   40.00000
2.00000    4.00000   50.00000   90.00000
3.00000    5.00000   50.00000    0.00000
4.00000    3.00000   70.00000    0.00000
5.00000    4.00000   20.00000    0.00000
0.00000    2.00000   10.00000    0.00000
2.50000    4.00000   70.00000    0.00000
4.00000    4.00000   80.00000    0.00000
0.00000    4.00000   30.00000    0.00000
1.00000    5.00000   60.00000    0.00000
2.00000    5.00000   40.00000    0.00000
3.00000    4.00000   80.00000    0.00000
4.00000    5.00000   20.00000    0.00000

同じ long,lang 座標があることがわかった場合は、2 番目の値を 4 番目の列に追加します。それらが一致しなかった場合は、0 のままにしました。このスクリプトが機能するために、1 つの前提を置きました。long,lang 座標は、マトリックス内で繰り返すことはできません。つまり、行列 x は 1,5 と 1,5 の 2 つの座標を持つことはできません。これは合理的な仮定だと思います。

追加とは、信号強度を一緒に追加することを意味する場合、コードを簡単に変更してこれを実現できます。あなたが取り組んでいる実際の問題に関しては、あなたが何をしているのかわかりませんが、面白そうです。うまくいったかどうか教えてください!(コードはいくつかの警告を出力しますが、無視しても安全だと思います)。関数は次のとおりです。

function temp=n_merge(A,B)
%Assumption 1:long, lang coordinates do not repeat within matrix A
%Assumption 2:long, lang coordinates do not repeat within matrix B

%Creating output matrix (over-allocating size)
temp=[A;zeros(size(B,1),3)];
temp=[temp zeros(size(temp,1),1)];

%Initializing variables for for-loop
counter=1;
sp=size(A,1);%starting point

for i=1:size(B,1)
b=sum(B(i,1:2)==A(:,1:2),2);                                             

if isempty(find(b==2))%if the long,lang coordinates are not in matrix A
temp(sp+counter,1:3)=B(i,1:3);
counter=counter+1;

else %if the long,lang coordinates are in matrix B
temp(find(b==2),4)=B(i,3);
end
end

%Removing all rows with 0's on them
temp(all(temp==0,2),:)=[];

幸運を!

于 2013-02-24T19:48:22.510 に答える