2012-06-27 3 views
8

мне нужно нормализовать вектор N целых чисел, так что:Как нормализовать вектор в Matlab, где сумма равна 1?

  • Каждое значение пропорционально своему исходному значению (значение будет находиться в диапазоне от 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» -> результирующий массив не изменяется
  • только один элемент ARRA y> 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 намек?

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

ответ

8

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

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

Это зависит. Какая у вас функция norm?

norm(x) в MATLAB возвращает стандартную норму, т.е. сумма квадратов элементов нормированного вектора x является 1.

В вашем примере:

v = [1, 1, 1];   %# norm(v) = sqrt(1^2+1^2+1^2) = ~1.7321 
v_norm = v/norm(v); %# v_norm = [0.5574, 0.5574, 0.5574] 

sum(v_norm .^ 2) Действительно урожайность 1, но sum(v_norm) не делает, как и ожидалось.


мне нужно нормализовать вектор N целых чисел, так что каждое значение пропорционально свое исходное значение (значение будет находиться в диапазоне от 0 до 1), а сумма всех значений 1.

Что вы имеете в виду под "нормализуют"? Означает ли это деление на значение, которое является действительной функцией математической нормы, согласно norm definition?

Что вы подразумеваете под "" 0 "?"? Означает ли это, что все элементы умножаются на таких же номер? Если это так, и это действительная математическая норма, вы не можете гарантировать, что сумма элементов всегда будет равна 1.
Например, рассмотрите v = [1, -2]. Затем sum(v) = -1.

Или, может быть, sum это функция, которую вы ищете, но это не математически квалифицировать как норму, потому что нормы является функцией, которая назначает строго положительную длину или размер для всех векторов в векторном пространстве ,
В приведенном выше примере sum(v) отрицательный.


AHY намек?

Вы можете выбрать:

  1. sum(x), которая удовлетворяет обоим требованиям, но не квалифицироваться как функция нормы, так как она может давать отрицательные значения.
  2. norm(x, 1), как предположил OleThomsenBuus, который фактически вычисляет sum(abs(x(:))).
    Он не будет соответствовать вашим требованиям, если вы не ограничиваете свое векторное пространство неотрицательными векторами.
6

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

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

В качестве побочного элемента 'sum (v)' не может математически квалифицироваться как [норма] (http://en.wikipedia.org/wiki/Norm_ (математика)), поскольку он может давать отрицательные значения. –

+0

Не соответствует требованию всех значений от 0 до 1 (с учетом отрицательных элементов). – Tobold

+0

Согласен. Я не должен был использовать «нормализацию» вместо «нормы», как и ОП. Я отредактирую свой ответ соответственно. – Deve

9

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

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 на итоговой сумме, но математически она больше не будет считаться нормой.

+0

+1: Хорошее предложение, но я не думаю, что 'abs' необходим. –

+0

Лучше? Спасибо, кстати. –

+0

Как я уже сказал в своем ответе, он все еще не удовлетворяет двум требованиям OP для векторов _all_, но по крайней мере он математически квалифицируется как норма. –