octave/matlab:根据一个矩阵中的单词在另一个矩阵中的存在情况创建新矩阵
在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
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循环更好的答案!