Как нормализовать вектор в Matlab, где сумма равна 1?

мне нужно нормализовать вектор из N целых чисел, так что:

  • каждое значение пропорционально его исходному значению (значение будет между 0 и 1)
  • сумма всех значений =1

например:

если у меня есть вектор

V = [2,2,1,0]

нормализованный вектор должен быть:

V_norm = [0.4,0.4,0.2,0]  % 0.4+0.4+0.2 = 1

Я пробовал многие решения, найденные в этом сообществе и в интернете, и наконец я сделал это код:

part = norm(V);
if part > 0
  V_norm = V/part;
else % part = 0 --> avoid "divide by 0" 
  V_norm = part;
end

проблема это работает, если:

  • все элементы массива " 0 " -- > результирующий массив не изменяется
  • только один элемент массива равен >0, а все остальные элементы = 0 --> результирующий массив: элемент >0 равен 1, а другой 0

а если у меня другой случай,хотя результат пропорционален,сумма не равна 0. Например:

   V = [1,0,1]
   V_norm = [0.74,0,0.74]

   V = [1,1,1]
   V_norm = [0.54,0.54,0.54]

(Я не уверен, что номер правильный, потому что я не могу используйте Matlab прямо сейчас, но я уверен, что сумма > 1)

Ahy намек?

спасибо заранее

3 ответов


... нормализованный вектор должен быть:

v_norm = [0.4, 0.4, 0.2, 0]; % 0.4+0.4+0.2 = 1

что зависит. Что такое ваш норма


что вам нужно сделать, это, я считаю, нормализовать с помощью 1-норма (таксомоторных норма):

v = [2, 2, 1, 0];
v_normed = v / norm(v, 1); % using the 1-norm

переменная v_normed теперь должно быть [0.4, 0.4, 0.2, 0.0]. В 1-норма v_normed будет равен 1. Вы также можете суммировать вектор (аналогично 1-норме, но без применения абсолютной функции к каждому значению), но диапазон этой суммы будет от -1 до 1 в общем случае (если какие-либо значения в v ниже 0). Вы могли бы использовать abs о результирующей сумме, но математически это больше не будет считаться нормой.


если нет условий furhter для вашей нормализации, чем вы дали в начале вашего вопроса, возможным решением будет

V = [3 4 -2];
S = sum(V);
if (S == 0)
    % no solution
else
    V_norm = V ./ S;
end
sum(V_norm)