0

次の行列がありますresult

result =
  Columns 1 through 13
     3     1     1     1     1     1     6     2     3     6     2     1     6
     4     3     3     5     7     5    10    10     4    10     6     9     8
     6     4     4     7     9     7     0     0     0     0     0     0     0
    10     5     5     8     0     0     0     0     0     0     0     0     0
  Columns 14 through 25
     2    10     3    10     3     8     8     0     0     0     0     0
     8     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0

その列の一意の要素インデックス サイズは (ゼロなし):

Indexes of result:
  Columns 1 through 13
     4     4     4     4     3     3     2     2     2     2     2     2     2
  Columns 14 through 25 
     2     1     1     1     1     1     1 

次のシナリオを実行したいと思います。最初の列から始めて、一意でない各値がマトリックスに一度だけ存在するように制限したいと考えています。したがって、col1 を開始点として、残りのマトリックスを次のように再配置する必要があります。

result =
  Columns 1 through 13
     3     1     1     1     1     1     0     2     0     0     2     1     0
     4     0     0     5     7     5     0     0     0     0     0     9     8
     6     0     0     7     9     7     0     0     0     0     0     0     0
    10     5     5     8     0     0     0     0     0     0     0     0     0
  Columns 14 through 25
     2     0     0     0     0     8     8     0     0     0     0     0
     8     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
 Indexes of result (without zeros):
  Columns 1 through 13
     4     2     2     4     3     3     0     1     0     0     1     2     1
  Columns 14 through 25 
     2     0     0     0     0     1     1      

ここで、col4 に最もユニークな要素があることがわかります。そのため、その値が 2 番目の再配置に続くと見なし、結果は次のようになります。

result =
  Columns 1 through 13
     3     0     0     1     0     0     0     2     0     0     2     0     0
     4     0     0     5     0     0     0     0     0     0     0     9     0
     6     0     0     7     9     0     0     0     0     0     0     0     0
    10     0     0     8     0     0     0     0     0     0     0     0     0
  Columns 14 through 25
     2     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0

Indexes of result (without zeros):
  Columns 1 through 13
     4     0     0     4     1     0     0     1     0     0     1     1     0  
  Columns 14 through 25 
     1     0     0     0     0     1     1    

これを必要な回数だけ行うと、その例では、col5 と col8 に対してさらに 2 回、目的の結果が得られます。

result =
  Columns 1 through 13
     3     0     0     1     0     0     0     2     0     0     0     0     0
     4     0     0     5     0     0     0     0     0     0     0     0     0
     6     0     0     7     9     0     0     0     0     0     0     0     0
    10     0     0     8     0     0     0     0     0     0     0     0     0
  Columns 14 through 25
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0

Indexes of result (without zeros):
  Columns 1 through 13
     4     0     0     4     1     0     0     1     0     0     0     0     0  
  Columns 14 through 25 
     0     0     0     0     0     0     0 

これを実行する最も効率的な方法はどれですか? あなたの提案を見てもらえますか?

前もって感謝します。

4

1 に答える 1

1

あなたの質問は言葉が不十分なので、以下は私がそれから何とか理解できたものの段階的な内訳です​​。

次の行列があるとしましょう。

result=[3  1  1  1  1  1  6  2  3  6  2  1  6  2 10  3 10 3  8  8  0  0  0  0  0;
        4  3  3  5  7  5 10 10  4 10  6  9  8  8  0  0  0  0 0  0  0  0  0  0  0;
        6  4  4  7  9  7  0  0  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0;
       10  5  5  8  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0]

1)各列の一意の要素の数を数えるには、各列で呼び出しuniqueて、ゼロ以外の要素を数えます。

count = arrayfun(@(n)sum(unique(result(:, n)) ~= 0), 1:size(result, 2))

2)列#1のすべての繰り返し要素を無効にするには、次のようにします。

idx = arrayfun(@(n)ismember(result(:, n), result(:, 1)), 2:N, 'Uniform', 0);
result(logical([idx{:}])) = 0

次に、すべての列を反復処理し、一意でない要素をすべて無効にする必要があるため、ループを使用してこれを実行します。したがって、最終的な解決策は次のとおりです。

N = size(result, 2);
ii = 0;
while (ii <= N)

    % # Count the number of unique elements in each column
    count = arrayfun(@(n)sum(unique(result(:, n)) ~= 0), 1:N);

    % # Advance to the next column with the maximum number of unique elements
    ii = ii + find(count(:, ii + 1:N) == max(count(:, ii + 1:N)) & count(ii + 1:N), 1);
    if isempty(ii)
        break
    end

    % # Nullify non-unique elements starting from column i
    idx = arrayfun(@(n)(ismember(result(:, n), result(:, ii)) & n ~= ii), 1:N, 'Uniform', 0);
    result(logical([idx{:}])) = 0;
end

これにより、目的の結果が得られます。

result=
    3  0  0  1  0  0  0  2  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0
    4  0  0  5  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0
    6  0  0  7  9  0  0  0  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0
   10  0  0  8  0  0  0  0  0  0  0  0  0  0  0  0  0  0 0  0  0  0  0  0  0

お役に立てば幸いです。

于 2012-12-02T17:04:25.743 に答える