у меня есть матрица в Matlab, которая выглядит примерно так, за исключением тысячи строк:MATLAB: Сохранение количества случайных строк в матрице, которые удовлетворяют определенные условия
A =
5 6 7 8
6 1 2 3
5 1 4 8
5 2 3 7
5 8 7 2
6 1 3 8
5 2 1 6
6 3 2 1
Я хотел бы Убирайтесь которая имеет три случайные строки с «5» в первом столбце и три случайные строки с «6» в первом столбце. Так что в этом случае выходной матрица будет выглядеть примерно так:
A =
5 6 7 8
6 1 2 3
5 2 3 7
6 1 3 8
5 2 1 6
6 3 2 1
Строки должны быть случайными, а не только первые три или последние три в исходной матрице. Я не уверен, как начать это, поэтому любая помощь будет принята с благодарностью.
EDIT: Это самая успешная попытка, которую я получил до сих пор. Я нашел все строки с «5» в первой колонке:
BLocation = find(A(:,1) == 5);
B = A(BLocation,:);
Тогда я пытался использовать «randsample», как это, чтобы найти три случайных строк из B:
C = randsample(B,3);
Но ' randsample 'не работает с матрицей.
Я также думаю, что это можно сделать немного более эффективно.
'index5 = find (A (:, 1) == 5);' будет работать лучше, я думаю. – yuk
@yuk, если вы получаете тот же результат, почему у вас есть накладные расходы на вызов find, поскольку вы можете напрямую индексировать 1: n, т. Е. Вектор индексов строк? Вышеупомянутая вы используете логическую индексацию только для вектора 1: n, который вы создаете аналитически. Если 'find' делает некоторую дополнительную оптимизацию производительности, я предполагаю, что она будет медленнее для больших матриц. Однако это не требует выделения нового вектора в памяти. – gevang
@gevang Я проверил ваш код на скорость. Это не замедляет работу больших матриц. Мой код (ниже) быстрее для небольших матриц (около 10000 строк), но после этого время его запуска увеличивается. Я думаю, это потому, что я контактирую. –