2013-12-03 3 views
2

У меня есть матрица A 3x3, которая имеет некоторый элемент равным 0. И я хочу, чтобы журнал calcualte (A). Но мы знаем, что log (0) не идентифицируется. Поэтому я хочу вычислить журнал матрицы A, игнорирующий элементы равные 0. И если элемент равен 0. Я хочу установить log (0) = 0. Как реализовать его в Matlab. Благодарим всех. Пример:Как вычислить журнал матрицы, но игнорировать значения, которые равны 0

A=[3 2 3 
    3 0 2 
    4 5 0] 
Log(A)=[ 1.0986 0.6931 1.0986 
      1.0986  0  0.6931 
      1.3863 1.6094   0] 
+2

Но 'Журнал (0) ~ = 0 'и' ехр (0) ~ = 0 '. То, что вы предлагаете, просто вызовет проблемы позже в ваших вычислениях. Лучше пойти с потоком и позволить 'log (0) == - Inf'. Вы можете оспаривать справедливость вычисления Matlab в этом отношении, но, по крайней мере, это ясно показывает, что вы взяли логарифм исключительной ценности. –

+0

Да, я знаю. Но если бы я не игнорировал элемент, равный нулю, мой расчет не срабатывает. В моем случае я не хочу, чтобы calulate элемент равный 0. Поэтому я установил их равными 0, чтобы игнорировать их – user3051460

+0

Просто nitpicking - но 'logm' там, чтобы вычислить журнал * матрицы *. Вы на самом деле выполняете логарифм по элементу. – bdecaf

ответ

4

Давайте первый набор на 1 Элементы, которые являются 0:

log(A+(A==0)) 
+0

Это умный ~! – cwhy

1

Я хотел бы использовать NaN, как log(NaN) = NaN:

A = [3 2 3; 
    3 0 2; 
    4 5 0]; 

A(A==0) = NaN; 
B = log(A); 

Но вы должны учитывать комментарий High Performance Mark. Я лично буду держать NaN. Если вы действительно хотите:

B(isnan(B)) = 0; 

возвращается:

B = 

    1.0986 0.6931 1.0986 
    1.0986   0 0.6931 
    1.3863 1.6094   0 
+1

Манипулирование NaN или Inf замедляет арифметические операции на порядок. Избегайте их, если вы хотите высоких выступлений. – user2987828

+0

@ user2987828, но вы знаете, что делаете то же самое (я просто этого не узнал)? 'A = A + (A == 0)' и 'A (A == 0) = NaN' похожи, поэтому я не понимаю смысла вашего комментария. – thewaywewalk

+0

@ user2987828: мое решение еще быстрее! – thewaywewalk

1

Прямой вперед подход:

B = zeros(size(A)) 
zl = find(A) 
B(zl) = log(A(zl)) 
+0

Ну, это была ошибка, а не особенность. (отредактирован ответ). Спасибо @HighPerformanceMark –

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