2016-07-10 7 views
1

У меня есть несколько матриц, каждый с одинаковым количеством столбцов, но с различными размерами строк. Каждая матрица содержит как положительные, так и отрицательные значения. Для группировки сакэ (потому что есть много матриц), каждая матрица хранится в массиве двумерных ячеек. Небольшой пример:Как нормализовать каждый соответствующий столбец в нескольких матрицах до значений от -1 до 1 в Matlab?

Matrix1: 
      C1 C2 C3 
    Val1  6 7 1 
    Val2  3 9 -7 
    Val3 -12 -22 -4 

Matrix2: 
      C1 C2 C3 
    Val1  5 19 -2 
    Val2  4 21 9 
    Val3 -1 3 11 
    Val4 -30 13 7 
    Val5  3 -4 10 

matrixStore{1,1} = Matrix1 
matrixStore{1,2} = Matrix2 

Я пытаюсь нормализовать значения -1 до 1 диапазона, в столбцах, по всей матрице-формы. Таким образом, используя в качестве примера, я получаю максимум и минимум значения для каждого столбца и поместить их в двух векторах:

% C1: Max = 6, Min = -30 
% C2: Max = 21, Min = -22 
% C3: Max = 11, Min = -7 

maxVals = [6, 21, 11]; 
minVals = [-30, -22, -7]; 

Как я теперь применяются максимальные и минимальные значения для нормализации каждого столбца для всех матриц?

Я использую следующий код, чтобы получить максимальные и минимальные значения:

maxColsBuilder = []; 
minColsBuilder = []; 

% Find the max values for each column in every matrix and stack them together 
maxColValsFromCell = cellfun(@max, matrixStore(1,:), 'Uni', 0); 
maxColMatrix = cell2mat(maxColValsFromCell'); 
maxColsBuilder = [maxColsBuilder, maxColMatrix']; 

% Do the same for the min values 
minColValsFromCell = cellfun(@min, matrixStore(1,:), 'Uni', 0); 
minColMatrix = cell2mat(minColValsFromCell'); 
minColsBuilder = [minColsBuilder, minColMatrix']; 

% Find the max values for each column 
maxVals = (max(maxColsBuilder, [], 2))' 

% Also find the min values for column 
minVals = (min(minColsBuilder, [], 2))' 

Может кто-нибудь помочь мне использовать эти векторы для нормализации мои данные по мере необходимости, пожалуйста?

+1

Просьба представить фактические данные образца. Я не могу понять, как форматируются ваши данные. Является ли 'matSamples' двумерным ячеистым массивом, где каждая ячейка является списком матриц? – rayryeng

+0

Являются ли размеры ваших матриц одинаковыми? Если да, рассмотрите возможность использования 'cell2mat' для складывания ваших матриц в трехмерном массиве' MyMat', а затем напрямую с помощью вызовов 'min (MyMat, 3)' и 'max (MyMat, 3)' – BillBokeey

+0

Привет, 'matSamples '- массив двумерных ячеек, в котором каждая ячейка содержит матрицу mxn, где m = выборочные значения (строки) и n = каналы (столбцы). Для каждой матрицы всегда есть 12 каналов, но количество значений выборки меняется. Извините, теперь я понимаю, что неправильно описал 'matSamples'. Я отредактирую свое сообщение соответственно. – humbleHacker

ответ

0

Следующий кода для каждого из вашей матрицы из вашего matrixStore отображения нормированной версии матрицы:

[unknown, matrices] = size(matrixStore); 
for matrixIndex = 1:matrices 
    [rows, columns] = size(matrixStore{1,matrixIndex}); 
    normMatrix = matrixStore{1,matrixIndex}; 
    for row = 1:rows; 
     for column = 1:columns; 
      normMatrix(row,column) = -1 + 2.*(matrixStore{1,matrixIndex}(row,column) - minVals(column))./(maxVals(column) - minVals(column)); 
     end; 
    end; 
    normMatrix 
end; 

Для примера вы предоставили:

normMatrix1 = 
1.0000 0.3488 -0.1111 
0.8333 0.4419 -1.0000 
     0 -1.0000 -0.6667 

normMatrix2 = 
0.9444 0.9070 -0.4444 
0.8889 1.0000 0.7778 
0.6111 0.1628 1.0000 
-1.0000 0.6279 0.5556 
0.8333 -0.1628 0.8889 

Если у вас есть новая версия Вместо Matlab вы можете использовать функцию normc.

+0

Это отлично работает @ Tomáš. После дальнейшего поиска я смог написать код, который дает тот же ответ, но с помощью функции 'bsxfun', чтобы транслировать операцию нормализации по всем строкам в матрице. Я добавил это как ответ на мой вопрос, чтобы другие могли прокомментировать. – humbleHacker

1

Сделав некоторые дополнительные поиски, я нашел ответ на @rayryeng на этот вопрос (Min-max normalization of individual columns in a 2D matrix), что я модифицированный в соответствии с:

[unknown, matrices] = size(matrixStore); 
for matrixIndex = 1:matrices 
    normMatrix = matrixStore{1, matrixIndex}; 
    normMatrix = bsxfun(@minus, bsxfun(@rdivide, bsxfun(@minus, normMatrix, minVals), maxVals - minVals), 0.5) * 2 
end; 

Это дает тот же результат, как перечисленная на @ TomášKratochvíla в своем ответе. Когда я применяю оба метода к некоторым фактическим данным выборки, состоящим из 6 матриц, содержащих 12 столбцов и несколько тысяч строк, я считаю, что метод, использующий bsxfun, будет быстрее.

Если у кого-либо есть дополнительная информация, касающаяся любого ответа, не стесняйтесь добавлять комментарии.

+0

Спасибо, что обратились ко мне в ответ. Пожалуйста, оплатите его, подав голос на мой ответ. Благодаря! – rayryeng

 Смежные вопросы

  • Нет связанных вопросов^_^