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

octave/matlab:根据一个矩阵中的单词在另一个矩阵中的存在情况创建新矩阵,matlab,matrix,octave,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

在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
要么是
0
,这取决于
some
中的单词是否存在于
all

,使用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);
如果不需要将新值作为单元格(对于0或1,没有理由不使用简单数组),那么这很简单:

new=zeros(size(all));
new(index_all)=1;
如果出于某种原因需要将其用作单元格,请使用:

new=num2cell(new);

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

使用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);
如果不需要将新值作为单元格(对于0或1,没有理由不使用简单数组),那么这很简单:

new=zeros(size(all));
new(index_all)=1;
如果出于某种原因需要将其用作单元格,请使用:

new=num2cell(new);
PS:您不应该使用
all
作为变量名-它是一个内置的Matlab函数,通过用变量覆盖它,您不能使用它,除非您清除该变量。

使用

new = ismember(all, some);
这将返回一个数组。但是如果你想把它放在一个单元格数组中,你可以使用

new = num2cell(ismember(all, some));
然而,正如Hugh Nolan在他的回答中提到的,通常最好避免将内置函数的名称(如
all
)作为变量名。

使用

new = ismember(all, some);
这将返回一个数组。但是如果你想把它放在一个单元格数组中,你可以使用

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

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

我使用了你的第一个建议,它非常有效!谢谢你,伙计!只是一个后续问题。。如果我有另一个矩阵,叫做
some2
,我对它应用相同的for循环来得到1和0,我如何将它添加到
新的
矩阵中,这样现在
新的
矩阵将有两列-第一列包含
some
的1和0,第二个包含来自
some2
的1和0?您可以生成一个新的2输出,并使用
new_combined=new | new2
从两者中获取非零值。我得到
错误:二进制运算符“|”不是通过“cell”操作为“cell”实现的
我使用了您的第一个建议,它非常有效!谢谢你,伙计!只是一个后续问题。。如果我有另一个矩阵,叫做
some2
,我对它应用相同的for循环来得到1和0,我如何将它添加到
新的
矩阵中,这样现在
新的
矩阵将有两列-第一列包含
some
的1和0,第二个包含来自
some2
的1和0?您可以生成一个新的2输出,并使用
new_combined=new | new2
从两者中获取非零值。我得到
错误:二进制运算符“|”不是通过“cell”操作为“cell”实现的
这是比for循环更好的答案!这是一个比for循环更好的答案!