[Редактировать: у всего есть очень простое решение: матрица использовала один тип данных вместо стандартного double]
Я только что заметил несколько странное (я думаю)Поведение в Matlab и интересно, что его вызывает.У меня есть матрица M размером 10000x500 со значениями в диапазоне
min(min(M)) = -226.9723 to
max(max(M)) = 92.8173
и
exp(-227) = 2.6011e-99
exp(93) = 2.4512e+40
, но если я получу всю матрицу exp, эта матрица будет иметь значения inf:
ii = isinf(exp(M));
sum(sum(ii))
ans =
2
Как Matlab хранит значения в матрице, чтобы операции над отдельными элементами могли дать другой результат, чем при выполнении той же операции над самой матрицей?
Т.е.
expM = exp(M);
exp(M(1)) == expM(1) ; %can be false, which I find surprising
IЯ знаю, что мне все равно нужно изменить алгоритм, так как высокие показатели дадут неточные результаты, даже если я смогу избежать значений inf.Это происходит в формуле для расчета искусственной нейронной сети, например:
sum(log(1+exp(ones(numcases,1)*b_h + data*w_vh)),2);
, поэтому я планирую разделить это на два случая, во-первых, когда показатель степени мал, я делаю вычисления, как указано выше, для высоких значенийЯ приблизительно
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
btw: есть ли лучший способ получить максимальный элемент матрицы, кроме как делать max дважды, как в max (max (M))? *