4

これを解決しようとしてレンガの壁にぶつかりました:

n 要素の配列へのインデックスのベクトルの 5x1 セル配列が与えられた場合、逆のマッピングを見つける必要があります。

私が持っているのは、「グループ2には、要素15、16、17、....があります」という関係です。私が持ちたいのは、「要素15はグループ2、4、5のメンバーです」です。

これは私のセル配列の構造です

myCellArray  = 

[1x228 double]
[1x79  double]
[1x136 double]
[1x93  double]
[1x81  double]

これは私のインデックス ベクトルの内容の一部です

myCellArray{2}(1:5) =

    15    16    17    18    19

私が欲しいのは、各要素のグループ メンバーシップのインデックスを含む n 個のセルのセル配列です。

ヘルプ?

4

2 に答える 2

5

cellfunとの組み合わせでこれを行うことができますarrayfun。最初に cell 配列を作成します。

>> mycellarray = { [1 2], [4 5], [3 4], [1 2 3 4 5] };

特定の数値 (たとえば 1) を含むセル配列の要素を取得するには、次を使用できますcellfun

>> find( cellfun(@(s)ismember(1, s), mycellarray) )
ans =
    1   4

これは、 1 が の 1 番目と 4 番目の要素にあることを示していますmycellarray。これで、 を使用して、考えられるすべてのインデックスのリストにこれをマップできますarrayfun。生成される配列は長さが異なる可能性があるため、 に設定'UniformOutput'する必要がありfalseます。

>> n = 5;
>> result = arrayfun(@(i)find(cellfun(@(s)ismember(i,s), mycellarray)), 1:n, ...
                     'UniformOutput', false);

要素は、必要なインデックス ベクトルです。

>> result{1}
ans =
     1     4    # since 1 is in the 1st and 4th array
>> result{3}
ans =
     3     4    # since 3 is in the 3rd and 4th array
于 2013-02-18T11:17:10.257 に答える
4

スペースを節約するためにセル配列を使用する必要がありますか?

それ以外の場合は、現在の行列を MxN 正規行列に変更できます。ここで、N は定義した n であり、M はグループの数です。そして、各行の終わりをゼロで埋めます。したがって、同じ情報を保持しますが、逆クエリを使用して簡単に実行できますfind

もしそうならn = [1 2 3 4 5 6 7]

グループ 1 が[1 4 5]、グループ 2 が[3]、グループ 3 が 3 つのグループがあり[1 2 6 7]、現在の行列は次のようになります。

M = 3; N = numel(n);

m = zeros(M,N);
m(1, 1:3) = [1 4 5];
m(2, 1) = 3;
m(3, 1:4) = [1 2 6 7];

次に、番号がどのグループにi属しているかを知りたいとします。それは(Chris Taylorの観察に基づいて更新された)と同じくらい簡単です

find(any(m == i, 2))
于 2013-02-18T11:21:03.457 に答える