2016-07-17 12 views
0

私はいくつかのループトラフを持つスクリプトを書いています。matrices。 私はこのようになります取得しています出力:行列からのプロファイル整数値

10,40,50 
20,60,50,80 
30,50,70,110 
30,70,110 

などを...私は何をしたいのか

は1人の行列が、それはなります10,40,50が含まれている場合は、そこに存在するどのように多くのユニークなプロファイルを数えることですまったく同じ(10,40,50)の別のマトリックスが見つかると、10,40,50のラベルが付いた1つのプロファイルとしてカウントされます(10,40,50)。

これを要約すると、私はトラフ行列を実行するスクリプトを持っています。彼らは時々彼ら自身を繰り返す異なる値を含んでいます、私は存在するすべての固有のプロファイルを数えたいと思います。出力は(カウントしかし出力することができる)でなければなりません

10,40,50 
10,40,50 
10,40,50 
30,50,70,110 
20,60,50,80 
30,50,70,110 
10,40,50 
10,40,50 

::私たちは入力にこれを言ってみましょう

10,40,50 found 5 time 

20,60,50,80 found 1 time 

30,50,70,110 found 2 time 

ヘルプは非常に、非常に多くの趣味のプロジェクトのためにこれをやって、感謝しています。

編集:使用しているセル配列ではありません。< 1x500>ベクターです。私はループしています。

答えて

1

(それはunique関数は数値ベクトルのセル配列に動作しないことを残念だ。)

次のようにあなたがそれを行うことができます。

x = { [10,40,50]; 
     [10,40,50] 
     [10,40,50]; 
     [30,50,70,110]; 
     [20,60,50,80]; 
     [30,50,70,110]; 
     [10,40,50]; 
     [10,40,50] }; 
[ii, jj] = ndgrid(1:numel(x)); % indices of all pairs 
m = cellfun(@isequal, x(ii), x(jj)); % all pairwise comparisons 
[u, v] = unique(m, 'rows', 'stable'); % unique rows, and their indices 
count = sum(u,2); % result: number of repetitions 
unique_x = x(v); % result: unique vectors 

これは

>> celldisp(unique_x) 
unique_x{1} = 
    10 40 50 
unique_x{2} = 
    30 50 70 110 
unique_x{3} = 
    20 60 50 80 
>> count 
count = 
    5 
    2 
    1 
を与えます

希望の形式で表示するには

for n = 1:numel(unique_x) 
    disp([mat2str(unique_x{n}) ' found ' num2str(count(n)) ' time(s)']) 
end 

プリント

[10 40 50] found 5 time(s) 
[30 50 70 110] found 2 time(s) 
[20 60 50 80] found 1 time(s) 

結果がループで得られている場合は、次のセル配列にそれらを収集して、上記を適用します。

x = cell(1,num_iter); % preallocate if possible 
for iter_index = 1:num_iter 
    % Do stuff that gives a vector iter_result as a result 
    x{iter_index} = iter_result; 
end 
% Now apply above code to x 
+0

はどのようにして(DISPで)このような出力を表示するには、私のスクリプトでこれを使用することもできます 10,40,50が 20,60,50,80は、1時間 30,50を発見した5時間を見つけて、 70,110が2回見つかりました –

+0

@ J.Smithこれは単純なループです。編集された答え –

+0

を参照してください。セルアレイではなく1つの列ベクトルだけの場合、どうしますか? –

0

私はあなたのスクリプトのあなたの出力はセル配列であると思います私の種類の臨時回答はこの前提に基づいているからです。したがって、スクリプトの出力が

output = {[10,40,50]; 
      [10,40,50]; 
      [10,40,50]; 
      [30,50,70,110]; 
      [20,60,50,80]; 
      [30,50,70,110]; 
      [10,40,50]; 
      [10,40,50]}; 

の場合、出力を文字列形式に変換できます。ラメが、:)作品:

tmp = cellfun(@num2str,output,'UniformOutput',false); 

そして、我々はunique機能を使用します。atmpのユニークな文字列である

[a,b,c]=unique(tmp); 

を、bはtmp内の文字列とcショーの最初の出現でありますtmpのどの要素がaのどの要素に対応しているか、つまりtmpaにマップします。ここで行う必要があるのは、c1 -s、2 -s、3 -sなどの数を数えることだけです。

for k = 1:length(b) 
    n(k) = nnz(c == k); 
    disp(['[',a{k},'] found ',num2str(n(k)),' time(s)']) 
end 

ので、最終的な出力は次のとおりです:

[10 40 50] found 5 time(s) 
[20 60 50 80] found 1 time(s) 
[30 50 70 110] found 2 time(s) 

希望

+0

セルアレイではなく、1列のベクトルだけではどうでしょうか? –

+0

@ J.Smith出力をセル配列に変換します:) – brainkz

0
output = {[10,40,50]; 
     [10,40,50]; 
     [10,40,50]; 
     [30,50,70,110]; 
     [20,60,50,80]; 
     [30,50,70,110]; 
     [10,40,50]; 
     [10,40,50]}; 
tmp = cellfun(@num2str,output,'UniformOutput',false); % number to string 
[a,~,c] = unique(tmp); % find unique profiles and index from tmp to a 
count = accumarray(c,1); % count same index in c 

その後

for k = 1 : length(a) 
    fprintf('[ %s ] found %d time(s)\n',a{k},count(k)); 
end 

に役立ちます私は、この目的のために単純なループを使用することを好みます他の回答と同じメッセージが表示されます。

+0

出力がセル配列でない場合はどうすれば使用できますか?スクリプトをループするのはベクトル<1x500>です。 –

+0

** <1x500> **とはどういう意味ですか?あなたは出力が単なるベクトルであることを意味しますか?次に、各プロファイルのサイズを知る必要があります。それははるかに手間がかかります。 – Dohyun

+0

はい、ただ1つのベクトルです。 –

関連する問題