2012-02-11 2 views
0

я не могу понять, что делает этот код:Matlab и любые, трудности в понимании

if any(scale==0) 
    loglik = -inf; 

Я должен перевести его на C++ с библиотекой Armadillo, что не имеет any функцию поэтому мне было интересно как это сделать.

Я читал matlab manuals, но он все еще запутан. Я тогда пытался с этим теста:

if any([*]==0) 
    1 
else 
    0 
end 

с использованием в качестве * эти значения (и многое другое):

[0 0;0 0] 
[1 0;0 0] 
[1 0;1 0] 
[1 0;0 1] 
[1 1;1 1] 

, но я до сих пор путают и результаты темно .. любое объяснение, пожалуйста, ?

ответ

2

Matlab (и Armadillo) представляют булевы как 0 для false и 1 (или на самом деле ничего, что не 0) для true. Они оба определяют оператор == по матрицам/векторам, который выполняет компонентные сравнения и выводит матрицу булевых. any берет в этой матрице булевых элементов и проверяет, отличны ли от нуля.

Armadillo не кажется, есть any, но это действительно обеспечивает find, которые могут быть использованы для реализации any:

!find(X, 1).is_empty() 

эквивалентно (хотя, возможно, медленнее): он строит вектор в большинстве одной неправительственной нулевые элементы (documentation for find). Если он пуст, то нет ненулевых элементов, поэтому any вернет false.

+0

для меня ** find (X, 0) .is_empty() ** works – nkint

+0

«1» просто заставляет его останавливаться после первого ненулевого индекса, который он находит. В противном случае он будет вычислять все из них. Не знаю, действительно ли это имеет значение для производительности. – perelman

+0

пример моей матрицы с i должен сделать любой * [1.0000 0.0100 0.1000 0.1000 0.1000 0.1000; 1.0000 0.0100 0.1000 0.1000 0.1000 0.1000] * и с отрицанием (**! **) и 1 .. он не работает, не понимаю, почему – nkint

Смежные вопросы