如何找出一個矢量是否只包含一個1而另一個是0?或者如何檢查每個條目是否相同?如何找出一個向量是否只包含一個1而另一個是0?或者如何檢查每個條目是否相同?
例如我需要檢查,如果一個向量包含了除只有一個1像零:
(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
如何找出一個矢量是否只包含一個1而另一個是0?或者如何檢查每個條目是否相同?如何找出一個向量是否只包含一個1而另一個是0?或者如何檢查每個條目是否相同?
例如我需要檢查,如果一個向量包含了除只有一個1像零:
(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
函數計算後續元素的差。如果結果的any
不爲零,則您的期望結果爲假。
function bool = allsame(vector)
d = diff(vector);
bool = ~any(d);
end
最準確的說,它應該是(numel(v(v == 1))== 1)來得到T/F。 – Marc
使用numel(unique(v))來檢查每個條目是否相同可能會有點慢,因爲unique會進行排序。我認爲〜任何(v〜= v(1))應該快得多,特別是如果v有很多元素。 – MatlabSorter