2017-02-21 75 views
1

Учитывая матрицу 12 x 13 в Matlab, мне нужно выбрать строку с наибольшим значением в столбце 9, каждые две строки и создать матрицу, содержащую выбранные строки. Следующий фрагмент кода выполняет эту работу, но мне было интересно, как этот синтаксис можно улучшить и сократить.Как можно укоротить и улучшить следующий синтаксис?

A = rand(12,13); 

a = A(1:2,:); 
if a(1,9) > a(2,9) 
    a = A(1,:); 
else 
    a = A(2,:); 
end 

b = A(3:4,:); 
if b(1,9) > b(2,9) 
    b = A(3,:); 
else 
    b = A(4,:); 
end 

c = A(5:6,:); 
if c(1,9) > c(2,9) 
    c = A(5,:); 
else 
    c = A(6,:); 
end 

d = A(7:8,:); 
if d(1,9) > d(2,9) 
    d = A(7,:); 
else 
    d = A(8,:); 
end 

e = A(9:10,:); 
if e(1,9) > e(2,9) 
    e = A(9,:); 
else 
    e = A(10,:); 
end 

f = A(11:12,:); 
if f(1,9) > f(2,9) 
    f = A(11,:); 
else 
    f = A(12,:); 
end 

SELECTED_A = [a;b;c;d;e;f]; 

спасибо.

ответ

3

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

A=rand(12,13); 
B=zeros(6,13); % preallocate solutionarray 
for ii=2:2:12 % loop through every (second) row 
    [~,ind]=max([A(ii,9),A(ii-1,9)]); % check which element is greater 
    B(ii/2,:)=A(ii-(ind==2),:); % select corresponding row 
end 

Это даст вам массив B со значениями, которые вы ищете.

EDIT: В коде был небольшой недостаток: условие в строке 5 кода должно быть ind==2, иначе он всегда будет выбирать строку с меньшей записью в колонке 9. В качестве альтернативы вы также можете оставить ее ind==1 и переключите элементы в строке 4, т.е. max([A(ii-1,9),A(ii,9)])

+2

OP нуждается в _rows_, 'SELECTED_A' является матрицей 6x13. –

+1

@ Jørgen вы правы, извините. Я исправлю это. – Max

+1

Нет проблем. 'max' возвращает индекс как второе возвращаемое значение. Используйте это, чтобы выбрать нужную строку. –

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

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