2

この問題を解決しようとしましたが、実装できませんでした。これについて何か手伝ってくれませんか。

問題

Mat1 | Mat2 | Mat3

 1 2 | 1 3  | 2 6

 1 3 | 2 6  | 2 5

 2 4 | 3 1  | 3 1

 3 1 | 3 5  | 5 2

 4 5 |

3つの行列がある場合(たとえば上記)、[column1 column2 matrixnumber]フォームの交差行に対してこの結果を取得したいと思います。

上記の例の結果は次のようになります

1 3 1

1 3 2

2 6 2

2 6 3

3 1 1

3 1 2

3 1 3

結果が次の形式であれば問題ありません[column1 column2 firstmatrix secondmatrix, ...]

1 3 1 2

2 6 2 3

3 1 1 2 3

この問題では、最大で1つのforループを使用します。

これについて何か考えがありますか?

4

2 に答える 2

4

ここでは、MATLABを使用した代替ソリューション(Guntherよりも高速に実行されるようです)intersect

Mat = {[1 2; 1 3; 2 4; 3 1; 4 5],
       [1 3; 2 6; 3 1; 3 5],
       [2 6; 2 5; 3 1; 5 2]};

result = zeros(sum(cellfun(@(x)size(x, 1), Mat)), 3); % # Preallocate memory
k = 1;
for cc = transpose(nchoosek(1:numel(Mat), 2))
    x = intersect(Mat{cc}, 'rows');                   % # Find intersection
    y = ones(size(x, 1), 2) * diag(cc);               % # Generate matrix indices
    result(k:k + numel(y) - 1, :) = [[x; x], y(:)];
    k = k + numel(y);
end

result(all(~result, 2), :) = [];                      % # Discard zero rows
result = unique(result, 'rows');                      % # Discard repeated rows

これで、マトリックスresultには、必要に応じて、一意の交差行とそれに対応するマトリックスインデックスが含まれるはずです。

result =   
     1     3     1
     1     3     2
     2     6     2
     2     6     3
     3     1     1
     3     1     2
     3     1     3
于 2012-12-30T11:59:01.837 に答える
3

私が正しく理解していれば、あなたはいくつかのペアのセットを持っています:Mat1、、、、...。次に、一意のペアを見つけてから、すべての一意のペアがどのセットに表示されるかを調べます。Mat2Mat3MatN

セットの数が多い場合は、セル配列を使用してそれらすべてを保持することをお勧めします。これにより、作業が非常に簡単になります。

N = 3; % total number of data sets
Mat = cell(N,1);
Mat{1} = [1 2;
          1 3;
          2 4;
          3 1;
          4 5];
Mat{2} = [1 3;
          2 6;
          3 1;
          3 5];
Mat{3} = [2 6;
          2 5;
          3 1;
          5 2];
% etc.

まず、一意のペアを見つけましょう。

uniq_pairs = unique(cat(1,Mat{:}),'rows');
M = size(uniq_pairs ,1);

次に、ismemberを使用して、どのセットにどのペアが含まれているかを確認します。

matcontpair = false(M,N); %preallocate
for ii=1:N % unavoidable loop
    matcontpair(:,ii) = ismember(uniq_pairs,Mat{ii},'rows');
end

この交差行列を各ペアの行列番号のセットに変換するには、もう一度ループして、最終結果をセル配列に格納します(同じサイズではない可能性があるため、配列を使用することはできません(一部のペアのみが見つかりました) 1回、他の2回、他の3回...)

pair_occurence= cell(M,1);
d=1:N;
for jj=1:M
    pair_occurence{jj} = d(matcontpair(jj,:));
end

これで、一意のペアを含むuniq_pairsサイズの行列と、サイズのオカレンスセル配列ができました。各セルはペアに対応し、ペアが存在する行列のリストが含まれています。Mx2pair_occurenceMx1

1つのマトリックスにのみ存在するペアをリストから削除する場合は、次を使用します。

% find them
lonely_pairs = cellfun(@numel,pair_occurence)<2;
% and destroy them
uniq_pairs(lonely_pairs,:) = [];
pair_occurence(lonely_pairs) = [];
于 2012-12-29T11:30:41.387 に答える