2013-11-14 5 views
0

Предположим, у меня есть эта матрица:фильтра некоторые строки из матрицы

matrix = [2 2; 2 3; 3 4; 4 5] 

А теперь я хотел бы, чтобы отфильтровать все строки, которые не начинаются с четным числом, чтобы произвести

[2 2; 2 3; 4 5] 

Есть ли процедура высокого уровня для этого, или мне нужно ее кодировать?

ответ

2

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

octave> matrix = [2 2; 2 3; 3 4; 4 5] 
matrix = 

    2 2 
    2 3 
    3 4 
    4 5 

octave> ! mod (matrix(:,1), 2) 
ans = 

    1 
    1 
    0 
    1 

octave> matrix(! mod (matrix(:,1), 2),:) 
ans = 

    2 2 
    2 3 
    4 5 

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

even_rows = matrix(! mod (matrix(:,1), 2), :) # first element is even 
s3_rows = matrix(matrix(:,1) == 3, :); # first element is 3 
int_rows = matrix(fix (matrix(:,1)), == matrix(:,1), :); # first element is an integer 

IF была функция, один все равно придется написать функцию, то не было бы легче короче или легче читать. Но если вы хотите, чтобы написать функцию, вы можете:

function selec = select_rows (func, mt) 
    selec = mt(func (mt(:,1)),:); 
endfunction 
even_rows = select_rows (@(x) ! mod (x, 2), matrix); 
se_rows = select_rows (@(x) x == 3, matrix); 
int_rows = select_rows (@(x) fix (x) == x, matrix); 

EDIT2: иметь те строки, которые уже совпавшие, просто следить за ними на маске. Пример:

mask = ! mod (matrix(:,1), 2); # mask for even numbers 
even = matrix(mask,:); 
mask = ! mask & matrix(:,1) == 3; # mask for left overs starting with a 3 
s3 = matrix(mask,:); 
rest = matrix(! mask, :); # get the leftovers 

Как и выше, вы можете написать функцию, которая это делает. В качестве первого аргумента возьмется матрица и любое количество дескрипторов функций. Он будет перебирать обработчики функций, изменяя маску каждый раз и заполняя массив ячеек матрицами.

+0

Спасибо, теперь я вижу, вы знаете, есть ли простой способ разбивать строки на несколько матриц? Я надеялся, что это будет одна и та же функция. –

+0

@wvxvw вы можете быть более конкретным? Почему вы хотите, чтобы они разделились? И как? Вы имеете в виду, что вам нужны группы из каждой строки? Я не знаю, о чем вы спрашиваете. – carandraug

+0

О, я хотел, чтобы, например, в моем примере была функция, которая задала предикат, который классифицирует строки в несколько категорий, возвращающих матрицы, каждая из которых содержит строки, принадлежащие этой категории. Скажем, я хотел, чтобы строки, которые имеют первый элемент 2, принадлежали к первой категории, строки, принадлежащие второй категории, имели бы 3 в качестве их первого элемента, а остальные - в третьей категории. Чтобы функция вернула 3 матрицы: '[2 2; 2 3], [3 4], [4 5] ' –

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