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矩阵相同,但值是10,具体取决于 中的单词是否some存在于all

4

2 回答 2

2

利用

new = ismember(all, some);

这将返回一个数组。但是如果你想在一个单元格数组中使用它,你可以使用

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

但是,正如 Hugh Nolan 在他的回答中提到的那样,避免使用内置函数的名称(例如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);

如果您不需要将新值作为单元格(对于零或一,没有理由不使用简单的数组),那么这很容易:

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

如果您出于某种原因需要它们成为一个单元格,请使用:

new=num2cell(new);

PS:您不应该all用作变量名 - 它是一个内置的 Matlab 函数,并且通过用变量覆盖它,在清除变量之前您不能使用它。

于 2013-07-11T15:23:04.673 回答