Как получить индекс строки конкретного значения [abcd] в двойной матрице? - PullRequest
0 голосов
/ 25 сентября 2019

Я создал таблицу, состоящую из четырех переменных [v1, v2, v3, v4], с почти 26000 строк.Мне нужно найти значения конкретной строки, например, [1 1 2 2016] в таблице (26000 x 4), и вернуть индекс строки, в которой находится поиск.

Пример того, что я хотел бы найти:

want_1 = [1 1 3 2016];
want_2 = [1 1 5 2016];

И хотел бы получить номер строки, в которой он находится.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Для матрицы вы можете использовать ismember с параметром 'rows':

M = [1 2 3 4; 1 1 3 2016; 5 6 7 8]; % example data matrix
wanted = [1 1 3 2016]; % example wanted row
result = find(ismember(M, wanted, 'rows'));

Это также работает с таблицей , если искомая строка является таблицей (из одной строки) с одинаковыми именами переменных:

M = table;
M.hour = [1; 2; 3]; M.day = [4; 5; 6]; M.month = [7; 8; 9]; M.year = [10; 11; 12];
wanted = table;
wanted.hour = 2; wanted.day = 5; wanted.month = 8; wanted.year = 11;
result = find(ismember(M, wanted, 'rows'));
2 голосов
/ 25 сентября 2019

Если у вас есть матрица M (которую вы можете получить из таблицы table2array(T)), вы сможете использовать неявное расширение * и all, чтобы получить свой результат

srch = [1 1 3 2016]; % Row to search for
res = find( all( M == srch, 2 ) );

find преобразует логический массив, возвращаемый all, в номера строк, где оно истинно.

Неявное расширение здесь в основном аналогично повторению массива srch для всей высоты матрицыM и затем поэтапную == операцию.Затем all гарантирует, что каждое сравнение в данной строке было истинным (то есть совпадением для каждого элемента srch).

* Неявное расширение основано на наличии MATLAB R2016b или новее ...для более старых версий вы можете добиться того же, используя bsxfun.


Так же, как в альтернативном упражнении, вы можете использовать splitapply вместо применения операторов all и ==для каждой строки по очереди это, вероятно, медленнее ...

res = find( splitapply( @(x)all(x==srch), M, (1:size(M,1)).' ) );

Или вы можете даже использовать rowfun, что немного замаскировано, но будет работать наваш стол T без предварительного преобразования в матрицу:

res = find( rowfun( @(varargin)all([varargin{:}]==srch), T, 'OutputFormat', 'uniform' ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...