2016-11-30 5 views
-1

Каков наилучший способ уменьшить количество строк матрицы пополам в Matlab?Как уменьшить количество строк матрицы пополам в matlab?

Что делает следующая команда?

mymatrix = mymatrix(1:2:end,:); 

Есть ли лучший способ доступа?

+0

Это, наверное, самый простой способ, да. – Suever

+0

@Suever, что это за команда? – anonymous

+0

Команда, которую вы дали, сохраняет каждую вторую строку, начиная с первой. Таким образом, он отбрасывает строки между ними. «Лучший» способ зависит от того, какое значение или роль имеет отброшенная информация: это изображение, которое вы хотите сжать? Если это так, лучше всего интерполировать значения пикселей перед отбрасыванием строк. Есть много других способов уменьшить количество строк (например, взять только верхнюю половину), поэтому «лучший» не определен, пока мы не узнаем, чего вы хотите достичь в контексте. – jez

ответ

1

Короткий ответ: это занимает каждую вторую строку матрицы mymatrix, начиная с первой (все нечетные строки) и да, это, вероятно, самый простой способ. Добавлено разъяснение на основе комментариев от @Sardar_Usama

Longer версия

end является MATLAB внутренняя команда, которая относится к концу массива в данном измерении. примерно эквивалент size(var,dim).

так на самом деле то, что mymatrix(1:2:end,:) может быть переписано на mymatrix(1:2:size(mymatrix,1),:). Теперь, если вы действительно посмотрите на 1:2:size(mymatrix,1), это строки, которые вы выбираете. 1, 3, 5, etc. Вы можете указать, какие строки вам там нужны, вот несколько примеров.

1:floor(end/2); % first 'half' 
floor(end/2)+1:end; % second 'half' 
1:3:end; % every third element 
1:2:floor(end/2); % every second element in the first 'half' 

Добавлен floor(), чтобы избежать проблем с длиной нечетного номера. В этом случае «половина» не ровно половина, а примерно половина. Альтернативно ceil() в зависимости от того, как вы хотите определить половину для нечетных длин.

+0

Почему я не подсчитываю количество строк n, а затем выбираю сначала n/2 строки? – anonymous

+0

Правильный ответ: ** Все строки, кроме каждой секунды ** –

+0

'end + 1: end;' не вторая половина. И '1: end/2;' может генерировать предупреждение, так как 'end/2' не может быть целым числом –