Как узнать, содержит ли вектор только одну 1, а остальные равны 0? или как проверить, все ли записи одинаковы? - PullRequest
3 голосов
/ 06 сентября 2011

как узнать, содержит ли вектор только одну 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

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

Вы можете использовать логическое индексирование, предполагая, что ваш вектор равен v: numel(v(v==1)) возвращает количество элементов, равное 1 в вашем векторе.

Таким же образом, если вы хотите проверить, является ли каждое значение одинаковым, вы можете использовать: numel(unique(v)), который возвращает число уникальных записей v.

1 голос
/ 07 сентября 2011

Немного другое решение:

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
0 голосов
/ 14 февраля 2014

Чтобы проверить ненулевой элемент, используйте функцию find. Если он находит только один индекс, и эта запись равна единице, то желаемый результат верен. В противном случае это ложь.

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

Для всех одинаковых записей функция diff вычисляет разность последующих элементов. Если any результатов отличны от нуля, желаемый результат равен false.

function bool = allsame(vector)
    d = diff(vector);
    bool = ~any(d);
end
0 голосов
/ 08 сентября 2011

Проверка на наличие только нулей может быть достигнута путем извлечения всех уникальных элементов из вашей переменной:

u = unique (v)

Затем вы можете сравнить результат с нулем и вуаля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...