2017-02-06 18 views
0

Я пытаюсь использовать vectorisation, чтобы функция нормализовала значения массива ячеек по разным максимальным значениям для каждого столбца.Как я могу использовать вертикализацию, чтобы функция нормализовала столбцы массива ячеек, итерации с помощью различных максимальных значений для каждого столбца?

Предположим, что у меня есть массив ячеек называется holdArray,

holdArray = {1 2 3 4 5 6 
       7 8 9 10 11 12 
       13 14 15 16 17 18 
       19 20 21 22 23 24} 

и предположим, у меня есть еще один массив ячеек, содержащий максимальные значения каждого столбца holdArray называется maxVal,

maxVal = {19 20 21 22 23 24} 

Я пытаюсь нормализовать столбцы в holdArray, используя значения в maxVal, т.е. каждое значение в первом столбце в holdArray будет нормализовано с использованием первого значения в maxVal и так далее.

Я знаю, что могу с легкостью сделать это, используя цикл for, но поскольку массивы, с которыми я буду работать, будут очень большими, я бы скорее использовал векторизацию. в настоящее время я сделал это так, где D это просто массив для хранения нормированных значений D = cellfun(@(x)(x./maxVal(1,:)), holdArray, 'UniformOutput', false)

который возвращает этот вывод:

D = 

    [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] 
    [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] 
    [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] 
    [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] [1x6 double] 

Значения это нормализуется каждое значение в столбце по всем значениям в maxVal

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

Благодаря

ответ

0

Не уверен, почему вы используете cell для двойников? Используйте cell2mat, чтобы преобразовать его в matrix, то векторизации легко ...

holdArray = {1 2 3 4 5 6 
       7 8 9 10 11 12 
       13 14 15 16 17 18 
       19 20 21 22 23 24}; 

holdArray = cell2mat(holdArray); % Converts cell to matrix 

maxVal = {19 20 21 22 23 24}; 
maxVal = cell2mat(maxVal); 

% Make matrix same size as holdArray but entire column is maxVal 
maxVal = repmat(maxVal, size(holdArray,1),1); 

% Element-wise division to normalise 
holdArray = holdArray./maxVal; 

% ans = 
% 
% [0.0526 0.1000 0.1429 0.1818 0.2174 0.2500 
% 0.3684 0.4000 0.4286 0.4545 0.4783 0.5000 
% 0.6842 0.7000 0.7143 0.7273 0.7391 0.7500 
% 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000] 

% If you really want it back in a cell, you can use mat2cell 
holdArray = mat2Cell(holdArray, size(holdArray,1)); 

С max работает на колоннах в любом случае, вам не нужны клетки/вектор maxVal на всех, и весь код может быть сжаты в это:

holdArray = {1 2 ... }; % abbreviated, use above definition 
holdArray = cell2mat(holdArray); 
holdArray = holdArray ./ repmat(max(holdArray), size(holdArray,1), 1); 
holdArray = mat2Cell(holdArray, size(holdArray,1));