0

Octave/MATLAB で、私が持っているとします:

all =
{
  [1,1] = one
  [1,2] = two
  [1,3] = three
  [1,4] = four
  [1,5] = five
  [1,6] = six
  [1,7] = seven
  [1,8] = eight
  [1,9] = nine
  [1,10] = ten
}

some =
{
  [1,1] = someword
  [1,2] = someword
  [1,3] = one
  [1,4] = someword
  [1,5] = nine
}

次のような新しいマトリックスを作成するにはどうすればよいですか

new =
{
  [1,1] = 1
  [1,2] = 0
  [1,3] = 0
  [1,4] = 0
  [1,5] = 0
  [1,6] = 0
  [1,7] = 0
  [1,8] = 0
  [1,9] = 1
  [1,10] = 0
}

つまり、new行列は行列と同じサイズですが、 の単語が?に存在するかどうかに応じてall、値は1またはのいずれかになります。0someall

4

2 に答える 2

2

使用する

new = ismember(all, some);

これは配列を返します。しかし、セル配列でそれが必要な場合は、使用できます

new = num2cell(ismember(all, some));

allただし、ヒュー・ノーランが彼の回答で述べたように、変数名などの組み込み関数の名前を避けることは一般的に良い考えです。

于 2013-07-11T16:10:30.047 に答える
1

for ループで簡単に:

new = cell(size(all));
for v=1:length(all)
    if any(strcmp(some,all{v}))
        new{v}=1;
    else
        new{v}=0;
    end
end

または、交差を使用できます。

[isect, index_all, index_some]=intersect(all,some);

新しい値をセルにする必要がない場合 (ゼロまたは 1 の場合、単純な配列を使用しない理由はありません)、これは簡単です。

new=zeros(size(all));
new(index_all)=1;

何らかの理由でそれらをセルにする必要がある場合は、次を使用します。

new=num2cell(new);

PS:all変数名として使用しないでください。これは組み込みの Matlab 関数であり、変数で上書きすると、変数をクリアするまで使用できません。

于 2013-07-11T15:23:04.673 に答える