2016-05-22 4 views
0

У меня есть матрица 20 * 120. Для каждого столбца в матрице мне нужно найти максимальное значение между всеми значениями, а затем суммировать оставшиеся значения. Затем мне нужно разделить максимальное значение суммированием оставшихся значений. Я попробовал следующий код, но результат был неправильным. В чем проблема?Что случилось со следующим кодом?

s = 1:z  %z=120 
for i = 1:x  %x=20 
    maximss = max(Pres_W);  %maximum value 
    InterFss = (sum(Pres_W))-maximss;  %remaining values 
    SIRk(:,s) = (maximss(:,s))./(InterFss(:,s)); 
end 
+0

Недействительный код MATLAB. Кроме того, что мы знаем о 'Pres_W'? Может ли он повторять ценности? Пожалуйста, предоставьте [mcve]. –

+1

@ Dev-iL, это действительный код MATLAB. –

+0

@StewieGriffin Почти, но не совсем. В нем отсутствует ключевое слово 'for'. Несмотря на то, что это может быть честная ошибка копирования, мне бы очень хотелось, чтобы OPs обращали внимание на то, что они загружают. По этой причине я также не исправил это. –

ответ

2

Вместо ответа «что случилось», я сначала предоставить решение, объясняющие, как это должно быть сделано:

Скажем, у нас есть пример матрицы m следующим образом:

m =  
    8 5 9 14 10 7 5 
    10 8 12 11 9 9 12 
    10 3 7 7 8 4 6 
    13 11 6 15 13 11 9 

Найти максимальное значение для каждого столбца:

col_max = max(m, [], 1) 
col_max =  
    13 11 12 15 13 11 12 

Сумма всех элементов в каждом столбце, и вычитать максимальные значения:

col_sum = sum(m, 1) - col_max 
col_sum =  
    28 16 22 32 27 20 20 

Разделить максимальное значение по сумме других элементов:

col_max ./ col_sum 
ans =  
    0.46429 0.68750 0.54545 0.46875 0.48148 0.55000 0.60000 

Или, как однострочника:

max(m,[],1)./(sum(m,1)-max(m,[],1)) 
ans = 
    0.46429 0.68750 0.54545 0.46875 0.48148 0.55000 0.60000 

Кстати: Ваш код делает именно то, что вы объяснить, она возвращает максиму um, деленное на все значения, за исключением максимального значения.


Примечания относительно наилучшей практики:

Vectorize вещи, как это, нет необходимости в петлях.

max(m, [], 1) такое же, как max(m) для 2D-массивов. Однако, если ваша матрица по какой-то причине имеет только одну строку, она вернет максимальное значение строки, таким образом, одно число.

sum(m,1) такое же, как sum(m) для 2D-массивов. Однако, если ваша матрица по какой-то причине имеет только одну строку, она вернет сумму строки, таким образом, единственное число.

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