Энтропия матрицы с использованием Matlab - PullRequest
2 голосов
/ 10 июля 2011

Дана матрица A с размерностью mxn и записи в матрице лежат [0,1]
Например

A = [0.5 0   0  0.5 0
     0   0.5 0  0   0.5
     1   0   0  0   0]

Я хотел бы рассчитать сумму (сумма (a_ij log (a_ij))) , где a_ij - это i -ая строка и j запись в матрице A .Поскольку в матрице существует запись 0, в результате я всегда получаю NAN .

Как считать только ненулевые записи для расчета сумма (сумма (a_ij log (a_ij))) [энтропия матрицы].

Ответы [ 3 ]

5 голосов
/ 10 июля 2011

Чтобы рассмотреть только определенные элементы матрицы, вы можете использовать логическое индексирование. Например, если вы хотите выбрать только ненулевые записи A, вы можете использовать A(A~=0). Таким образом, для вашей проблемы решение может быть написано:

sum(A(A~=0).*log(A(A~=0)));

РЕДАКТИРОВАТЬ: вау, это какое-то совпадение, я только что видел ваш комментарий после публикации этого. Хорошо, рад, что ты сам с этим справился.

2 голосов
/ 10 июля 2011

Если это очень большой массив:

sum(A.*log(A+eps))  

, который должен быть быстрее индексации.

1 голос
/ 10 июля 2011

Другая возможность:

x = A(:);
E = x' * log(x + (x==0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...