Вы можете получить логический индекс для строк, чей первый элемент четный, и использовать :
для выбора всех столбцов. Вот как это делается, построчно:
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
Как и выше, вы можете написать функцию, которая это делает. В качестве первого аргумента возьмется матрица и любое количество дескрипторов функций. Он будет перебирать обработчики функций, изменяя маску каждый раз и заполняя массив ячеек матрицами.
Спасибо, теперь я вижу, вы знаете, есть ли простой способ разбивать строки на несколько матриц? Я надеялся, что это будет одна и та же функция. –
@wvxvw вы можете быть более конкретным? Почему вы хотите, чтобы они разделились? И как? Вы имеете в виду, что вам нужны группы из каждой строки? Я не знаю, о чем вы спрашиваете. – carandraug
О, я хотел, чтобы, например, в моем примере была функция, которая задала предикат, который классифицирует строки в несколько категорий, возвращающих матрицы, каждая из которых содержит строки, принадлежащие этой категории. Скажем, я хотел, чтобы строки, которые имеют первый элемент 2, принадлежали к первой категории, строки, принадлежащие второй категории, имели бы 3 в качестве их первого элемента, а остальные - в третьей категории. Чтобы функция вернула 3 матрицы: '[2 2; 2 3], [3 4], [4 5] ' –