1

私は次の2つの行列を持っています

c=[1 0 1.05 
   1 3 2.05
   1 6 2.52
   1 9 0.88
   2 0 2.58
   2 3 0.53
   2 6 3.69
   2 9 0.18
   3 0 3.22
   3 3 1.88
   3 6 3.98]

f=[1 6 3.9
   1 9 9.1
   1 12 9
   2 0 0.3
   2 3 0.9
   2 6 1.2
   2 9 2.5
   3 0 2.7]

そして、最終的なマトリックスは

n=[1 6 2.52 3.9
   1 9 0.88 9.1
   2 0 2.58 0.3
   2 3 0.53 0.9
   2 6 3.69 1.2
   2 9 0.18 2.5
   3 0 3.22 2.7]

私が使用したコードは、結果として前の行列[n]の最後の行のみを提供します。

for j=1
  for i=1:rs1
     for k=1
          for l=1:rs2
               if f(i,j)==c(l,k) && f(i,j+1)==c(l,k+1)                 
                  n=[f(i,j),f(i,j+1),f(i,j+2), c(l,k+2)];
               end
          end
      end 
   end
 end

誰かがこれについて私を助けることができますか?もっと簡単なものはありますか?

前もって感謝します

4

5 に答える 5

1

Mathworksサポートに関するこの回答によると、統計ツールボックスから結合を使用できます。具体的には、内部結合を使用できます。

残念ながら、matlabを搭載したコンピューターにアクセスできませんが、試してみて、どのように機能するかをお知らせください。

于 2013-03-24T20:55:44.607 に答える
1

ループでこれを行うことを主張する場合nは、使用しているループカウンターに応じて適切なディメンションを指定するか、各反復のそれ自体に連結する必要があります(これは大きな行列の場合は非常に遅くなる可能性があります)。たとえば、次のように記述します。

for j=1
  for i=1:rs1
    for k=1
      for l=1:rs2
           m=m+1;
           if f(i,j)==c(l,k) && f(i,j+1)==c(l,k+1)                 
              n(m,:)=[f(i,j),f(i,j+1),f(i,j+2), c(l,k+2)];
           end
       end
    end 
  end
end

ループがカウンター値のに達すると、for番号がm番目の行に保存されますm

ただし、これはネストされたループやif条件がなくても、ベクトル化された方法で実行できることに注意してください。たとえば、条件の代わりにif f(i,j)==c(l,k)...使用できるismemberなど...

于 2013-03-24T21:35:45.567 に答える
1

の最初の列と2番目の列の両方を一度に比較し、「all」関数を使用して、両方が一致する場合にのみ値を折りたたむことにより、ループの数を減らすことができます。次のスニペットは、指定した「n」配列を複製したものです。

n = [];
for r1 = 1:size(c, 1)
    for r2 = 1:size(f,1)
        if all(c(r1, [1 2]) == f(r2, [1 2]))
            n(end+1, 1:4) = [c(r1,:) f(r2,3)];
        end
    end    
end
于 2013-03-24T21:44:35.573 に答える
1

集合演算の使用方法を学び、可能な限りループを回避する必要があります。ここintersectで非常に役立つ可能性があります:

[u, idx_c, idx_f] = intersect(c(:, 1:2) , f(:, 1:2), 'rows');
n = [c(idx_c, :), f(idx_f, end)];

説明:'rows'フラグを指定することにより、とintersectで共通の行を検索し、それらのインデックスはそれぞれとで指定されます。ベクトル添え字を使用して行列を抽出します。cfidx_cidx_fn

あなたの質問の例を使ってみましょう:

c = [1 0 1.05;
     1 3 2.05
     1 6 2.52
     1 9 0.88
     2 0 2.58
     2 3 0.53
     2 6 3.69
     2 9 0.18
     3 0 3.22
     3 3 1.88
     3 6 3.98];

f = [1 6 3.9
     1 9 9.1
     1 12 9
     2 0 0.3
     2 3 0.9
     2 6 1.2
     2 9 2.5
     3 0 2.7];

[u, idx_c, idx_f] = intersect(c(:, 1:2) , f(:, 1:2), 'rows');
n = [c(idx_c, :), f(idx_f, end)];

これにより、目的の結果が得られるはずです。

n =
    1.0000    6.0000    2.5200    3.9000
    1.0000    9.0000    0.8800    9.1000
    2.0000         0    2.5800    0.3000
    2.0000    3.0000    0.5300    0.9000
    2.0000    6.0000    3.6900    1.2000
    2.0000    9.0000    0.1800    2.5000
    3.0000         0    3.2200    2.7000
于 2013-03-28T00:14:56.090 に答える
0

forループがまったくない場合はどうでしょうか(ネイティブコード以外)

mf = size(f,1);
mc = size(c,1);
a = repmat(c(:,1:2),1,mf);
b = repmat(reshape((f(:,1:2))',1,[]),mc,1);
match = a == b;
match = match(:, 1 : 2 : 2*mf) & match(:, 2 : 2 : 2*mf);

crows = nonzeros(diag(1:mc) * match);
frows = nonzeros(match * diag(1:mf));

n = [c(crows,:),f(frows,3)]
于 2013-03-26T18:37:55.760 に答える