2010-07-19 2 views
3

[Edit: Все это имеет очень простое решение: матрица используется единственным типом данных, а не по умолчанию двойного]MATLAB: ехр (X) дает инф даже если ехр (макс (X)) не

Я только что заметил несколько своеобразное (я думаю) поведение в Matlab и задаюсь вопросом, что его вызывает. У меня есть 10000x500 матрицы M со значениями в диапазоне от

min(min(M)) = -226.9723 to 
max(max(M)) = 92.8173 

и

exp(-227) = 2.6011e-99 
exp(93) = 2.4512e+40 

но если ехр всей матрицы, эта матрица имеет Inf значения:

ii = isinf(exp(M)); 
sum(sum(ii)) 
ans = 
    2 

Как Matlab магазин значения в матрице, так что операции с отдельными элементами могут дать другой результат, чем при выполнении той же самой операции над самой матрицей?

I.e.

expM = exp(M); 
exp(M(1)) == expM(1) ; %can be false, which I find surprising 

Я знаю, что в любом случае, чтобы изменить алгоритм, как высокие показатели будут давать неточные результаты, даже если я могу избежать Inf значений. Это происходит в формуле для искусственного расчета нейронной сети, как:

sum(log(1+exp(ones(numcases,1)*b_h + data*w_vh)),2); 

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

log(1+exp(ones(numcases,1)*b_h + data*w_vh) 

с

ones(numcases,1)*b_h + data*w_vh 

это звучит разумно? Мои рассуждения, конечно, что

log(1+exp(x)) ≈ log(exp(x)) ≈ x, for large x 

кстати: есть лучший способ, чтобы получить максимальный элемент матрицы другого, чем делать максимум два раза в макс (макс (M))?

+1

Интересная проблема ... Кажется, я не могу воспроизвести ее на своей машине с помощью R2010a, я не получаю никакой инфы и exp (a) always == expa, где expa = exp (a) – Xzhsh

+0

Да, я не смог найти простой пример кода, который генерирует матрицу, которая показывает это поведение:/Я загружу файл мата для любого, достаточно любопытного, для ухода :) –

+0

Странно. Я могу сказать, что этого не происходит в GNU Octave, или, по крайней мере, я не смог бы воспроизвести это. –

ответ

3

Хорошо, я нашел ошибку: моя матрица была типа single, но когда я скопировал значение в новой переменной, которая была бы двойной, конечно, с другим максимальным значением. Я отвечаю на это сам, поэтому вопрос не останется без ответа. Спасибо за советы, я нашел причину при попытке создать репродукцию :)

+2

Я могу подтвердить, что 'exp (single (93)) 'приводит к' Inf', тогда как 'exp (93)' does not. – gnovice

+0

И теперь это имеет прекрасный смысл, но меня уже немного смутило. Даже не подумал, что матрица может быть не «нормальной» матрицей с двойной точностью ... –

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