OCTAVE энтропия перестановок - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь посчитать энтропию перестановки в октаве, но все время получаю ошибку

[pe] = entr_p(y,2)
warning: entr_p: some elements in list of return values are undefined
warning: called from
    entr_p at line 4 column 1
pe = [](0x0)

, где y определяется как ряд, а m - это число

Ниже приведенокод

function pe = entr_p (y, m)
  ly        = length (y);
  permlist  = perms (1 : m);
  dl        = length (permlist);
  c(1 : dl) = 0;

  for  j = 1 : (ly - (m - 1))
    temp = y(j : j + (m - 1));
    iv   = sort (temp);
    ziv  = zeros (size (iv));

    for dj = 1 : length (ziv)
      ziv(dj) = find (temp == iv(dj), 1);
    endfor

    for jj = 1 : dl
      if (abs (permlist (jj, :) - ziv')) == 0
        c(jj) = c(jj) + 1;
      endif
    endfor
  endfor

  c(c == 0) = [];
  p  = c / sum (c);
  pe = - sum (p .* log (p));
endfunction

Не могли бы вы мне помочь?

Большое спасибо!

y = [ 3.0818e+008, 3.0343e+008, 3.0398e+008, 3.5395e+008, 3.8701e+008, 4.7602e+008, 5.2773e+008 ...
  6.7721e+008, 7.0715e+008, 7.1041e+008, 8.1292e+008, 1.1597e+009, 1.3512e+009, 1.6434e+009 ...
  2.0692e+009, 2.3338e+009, 2.3213e+009, 2.3739e+009, 3.1167e+009, 4.8214e+009, 6.7460e+009 ...
  6.7235e+009, 7.4145e+009, 7.0809e+009, 9.7301e+009, 1.4304e+010, 1.2987e+010, 1.4850e+010 ...
  1.3753e+010, 1.4260e+010, 1.5788e+010, 1.3651e+010, 1.2335e+010, 2.0085e+010, 1.9479e+010 ...
  2.2976e+010, 2.6954e+010, 2.3744e+010, 1.9389e+010, 2.4151e+010, 2.7922e+010, 2.3605e+010 ...
  3.2405e+010, 3.7712e+010, 4.4308e+010, 4.6986e+010, 5.6842e+010, 6.0840e+010, 5.0950e+010 ...
  4.8859e+010, 5.2798e+010, 4.9397e+010, 5.1856e+010, 5.8283e+010, 6.4801e+010, 5.7456e+010 ...
  6.0445e+010 ]

1 Ответ

0 голосов
/ 07 июня 2018

В результате получается, что в строке

if (abs (permlist (jj, :) - ziv')) == 0

этот тест не пройден, и поэтому c никогда не обновляется по сравнению с тем, что было инициализировано в начале.

Следовательно,когда вы достигли линии

c(c == 0) = [];

, учитывая, что начальный c инициализирован нулями, вы удаляете и эти нули, и вы и c = [], и затем все становится плохооттуда

В приведенном выше утверждении if вы, по сути, сравниваете [1, 0; 0, 1] == 0, который, по-видимому, в контексте оператора 'if' перенаправляет к предложению 'else'.Чего вы ожидали в результате этого сравнения?

...