Matlab 如何确定一个向量是否只包含一个1而另一个为0?或者如何检查每个条目是否相同?

Matlab 如何确定一个向量是否只包含一个1而另一个为0?或者如何检查每个条目是否相同?,matlab,Matlab,如何确定一个向量是否只包含一个1而另一个为0?或者如何检查每个条目是否相同 e、 g.我需要检查向量是否包含除1以外的0,如: (0 0 0 0 1 0 0 0 0) -> true (0 0 0 0 0 0 0 0 1) -> true (0 0 0 0 2 0 0 0 0) -> false (0 0 1 0 1 0 0 0 0) -> false 可以使用逻辑索引,假设向量是v:numel(v(v==1))返回向量中等于1的元素数 同样,如果要检查每个值是否相同,

如何确定一个向量是否只包含一个1而另一个为0?或者如何检查每个条目是否相同

e、 g.我需要检查向量是否包含除1以外的0,如:

(0 0 0 0 1 0 0 0 0) -> true
(0 0 0 0 0 0 0 0 1) -> true
(0 0 0 0 2 0 0 0 0) -> false
(0 0 1 0 1 0 0 0 0) -> false

可以使用逻辑索引,假设向量是
v
numel(v(v==1))
返回向量中等于1的元素数


同样,如果要检查每个值是否相同,可以使用:
numel(unique(v))
,它返回
v
的唯一条目数,这是一个稍微不同的解决方案:

v = [0 0 0 0 1 0 0 0 0];
TF = sum(v==1)==1           %# returns TRUE
如果要将其应用于矩阵的所有行,这一点尤其有用:

M = [
    0 0 0 0 1 0 0 0 0 ;
    0 0 0 0 0 0 0 0 1 ;
    0 0 0 0 2 0 0 0 0 ;
    0 0 1 0 1 0 0 0 0 
];
TF = sum(M==1,2)==1
结果是:

>> TF
TF =
     1
     1
     0
     0

通过从变量中提取所有唯一元素,可以实现仅检查零:

u = unique (v)

然后,您可以将结果与零进行比较,瞧。

要检查非零元素,请使用
find
功能。如果它只找到一个索引,并且该条目是一个,那么您想要的结果就是真的。否则就是假的

function bool = oneone(vector)
    num = find(vector);
    bool = isscalar(num) && vector(num)==1;
end

对于所有相同的条目,
diff
函数计算后续元素的差异。如果
任何
结果为非零,则所需结果为假

function bool = allsame(vector)
    d = diff(vector);
    bool = ~any(d);
end

最准确地说,应该是(numel(v(v==1))==1)来获取T/F。使用numel(unique(v))检查每个条目是否相同可能有点慢,因为unique进行排序。我认为~any(v~=v(1))应该快得多,特别是当v有许多元素时。那么
22122
00102
呢?他们会是真的,对吗?我认为解决方案还应该检查唯一值。虽然它可能不在问题的范围之内。您是正确的,我们还应该检查我们只处理0和1(除了前面的测试):
all(v==0 | v==1)
all(M==0 | M==1,2)