Как нормализовать вектор в 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)