1

私はマトリックスを持っており、このマトリックスの行を別のマトリックスの行と比較し、それらに一致する行があるかどうかを確認したいと考えています。

例えば:

A = [ 1 2 3;...
      4 5 6;...
      7 8 9 ];

B = [ 54 23 13;...
      54 32 12;...
      1.1 2.2 2.9];

マトリックス A の行 1 がマトリックス B の行 3 と一致することを検出する必要があります。+-10% のマージンが必要なため、行は等しくありません。

どうもありがとうございました。

4

3 に答える 3

3

このコードはテストされていませんが、実行する必要があります。

valid = all(abs(A(1,:) - B(3,:)) ./ A(1,:) < 0.1)

説明:

  • A(1,:)の最初の行をA取りB(3,:)、の3番目の行を取りますB
  • abs(...)絶対値を取ります。
  • abs(...) ./ A(1,:)変化率を示します
  • < 0.1各要素が10%未満であることを確認します。
  • all(...)最後のステップの値を集計し、それらがすべて真であることをテストします。
于 2013-02-06T12:23:29.533 に答える
3

一般に、A のどの行が B と一致するかがわからない場合は、Fabian answer の拡張である for ループを作成しました....

for i = 1:size(A,1)
      match(:,i) = sum(abs(ones(size(A,1),1)*A(i,:) - B) ./ (ones(size(A,1),1)*A(i,:)) <= 0.100001, 2) == size(A,2)*ones(size(A,1),1);        
  end

match(i,j) == 1 は、B の i 番目の行が A の j 番目の行と一致する場合

于 2013-02-06T12:55:26.487 に答える
0

他のフォーラムでこの質問をすると、可能な限り最良の回答が得られます。

margin = 0.1;
A = [1 2 3; 4 5 6; 7 8 9];
B = [7 8 10; 4 5 12; 1.1 2.2 2.9; 1.101 2 3; 6.3 7.2 9.9];
k = 0;
for i = 1:size(A,1)
    for j = 1:size(B,1)
        if all(abs((A(i,:)-B(j,:))./A(i,:)) <= margin+eps)
            k = k+1;
            match(:,k) = [i;j];
        end
    end
end
fprintf('A row %d matches B row %d.\n',match)

すべての回答に感謝し、受け入れられた回答を提供しますが、これが私にとって最良のコードだと思います。

于 2013-02-06T16:27:59.827 に答える