Итак, попробовав тяжелую циклическую функцию для вычисления совместной энтропии двух источников информации, я нашел эту полезную функцию MATLAB, accumarray
, и попробовал следующий код:
function e = jointEntropy(fonte1, fonte2)
i = double(fonte1(:))+ 1;
j = double(fonte2(:)) + 1;
subs = [i j];
f = accumarray(subs, ones(length(fonte1), 1));
p = f / length(fonte1);
freq = f ~= 0;
prob = p(freq);
e = -sum(prob.*log2(prob));
end
, где fonte1
и fonte2
источники информации, 1xN
массивы. Это отлично работало с примерами, в которых оба источника имели только положительные целые значения, но затем я попытался использовать его с аудиофайлами (то есть массивами, значения которых варьировались от -1 до 1), и это продолжало выдавать мне ошибку. Я пробовал добавлять 1 к каждому массиву (в диапазоне от 0 до 2), умножая их на 100 и округляя числа, чтобы получить неотрицательные целые числа, но это все равно не работает.
Любая идея/альтернатива этому коду будет принята с благодарностью.
e = -sum(sum(p.*full(spfun(@log2,p))));
илиe = -sum(sum(p.*(log2(p+(p==0)))));
. Посмотрите, что быстрее. - person chappjc   schedule 23.10.2014accumarray
вы можете просто выполнитьaccumarray(subs,1)
, и он будет использовать1
для каждого сабвуфера. - person chappjc   schedule 23.10.2014subs
:[~,~,id1] = unique(fonte1(:)); [~,~,id2] = unique(fonte2(:)); subs = [id1 id2];
. Я также должен обновить свой пост, чтобы отразить это. Спасибо за идею! - person rayryeng   schedule 02.01.2015accumarray
, я поблагодарил вас в скобках. Я бы не научился эффективно его использовать, если бы не ты... так что я действительно должен благодарить тебя! - person rayryeng   schedule 02.01.2015accumarray
... виновным в предъявленном обвинении! :D - person chappjc   schedule 02.01.2015accumarray
... Я тоже пытаюсь поделиться любовью ;) - person rayryeng   schedule 02.01.2015