octave / matlab:根据另一个矩阵中单词的存在来创建新矩阵

时间:2013-07-11 15:18:41

标签: matlab matrix octave

在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中的字词{1}}中存在{1}}

2 个答案:

答案 0 :(得分:2)

使用

new = ismember(all, some);

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

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

然而,正如Hugh Nolan在他的回答中所提到的,通常一个好主意是避免将all等内置函数的名称作为变量名。

答案 1 :(得分: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

或者,您可以使用intersect:

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

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

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

如果由于某种原因需要将它们作为单元格,请使用:

new=num2cell(new);

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