Использование ismember() с массивами ячеек, содержащими векторы

Я использую массив ячеек, чтобы содержать векторы 1x2 местоположений сетки в форме [row, col]. Я хотел бы проверить, включено ли другое местоположение сетки в этот массив ячеек.

К сожалению, мой текущий код приводит к ошибке, и я не совсем понимаю, почему:

in_range = ismember( 1, ismember({[player.row, player.col]}, proximity(:,1)) );

где player.row и player.col — целые числа, а первый столбец proximity — это вышеупомянутый массив ячеек ячеек сетки.

ошибка, которую я получаю:

??? Error using ==> cell.ismember at 28
Input must be cell arrays of strings.

К сожалению, мне не удалось найти никакой информации об использовании ismember() таким образом, только с массивами ячеек в виде строк или с отдельными целыми числами в каждой ячейке, а не с векторами.

Я рассматривал возможность преобразования с использованием num2str() и str2num(), но, поскольку я должен выполнять вычисления между преобразованиями и из-за количества итераций, код будет зацикливаться (10 000 циклов, 4 преобразования на цикл), этот метод кажется запредельно.

Любая помощь здесь будет принята с благодарностью, спасибо

РЕДАКТИРОВАТЬ: Почему ismember() возвращает эту ошибку? Обрабатывает ли он все векторы в массиве ячеек как массивы строк?

РЕДАКТИРОВАТЬ: Будет ли лучший/более эффективный метод определения, находится ли 1 в возвращаемом векторе, чем

ismember( 1, ismember(...))?


person avDiGuida    schedule 23.12.2012    source источник


Ответы (1)


У меня сейчас мало времени (будучи Крисси Евой и все такое), так что это должен быть очень быстрый ответ.

Насколько я понимаю, проблема состоит в том, чтобы найти, лежит ли координата x y в последовательности многих координат x y, и если да, то индекс того, где она лежит. Если это так, и если вы заинтересованы в эффективности, то возиться со строками или массивами ячеек расточительно. Для этого вы должны использовать числовые матрицы/векторы.

Итак, мое предложение: преобразовать первую строку массива ячеек в числовую матрицу. Затем сравните свои координаты x y со строками этой числовой матрицы. Поскольку вы хотите знать только, когда обе координаты соответствуют строке числовой матрицы, используйте параметр 'rows' для ismember — он вернет истину только при совпадении всей строки, а не при совпадении одного элемента.

Вот пример кода, который, надеюсь, поможет:

%# Build an example cell array with coordinates in the first column, and random strings in the second column
CellOfLoc = {[1 2], 'hello'; [3 4], 'world'; [5 6], '!'};

%# Convert the first column of the cell array to a numerical matrix
MatOfLoc = cell2mat(CellOfLoc(:, 1));

%# Build an example x y coordinate location to test
LocToTest = [5 6];

%# Call ismember, being sure to use the rows option
Index = ismember(MatOfLoc, LocToTest, 'rows');

Обратите внимание: если индексы в вашем массиве ячеек имеют строковую форму, то, очевидно, вам также понадобится вызов str2num где-то перед тем, как вы вызовете ismember.

Еще одна вещь, я заметил, что вы новый участник, так что добро пожаловать на сайт. Если вы считаете, что этот ответ удовлетворительно ответил на ваш вопрос, отметьте вопрос, на который был дан ответ, щелкнув галочку рядом с этим ответом.

person Colin T Bowers    schedule 24.12.2012
comment
Я не рассматривал вариант 'rows' при сопоставлении по матрице (поэтому я подумал, что мне нужно использовать массив ячеек). Спасибо! - person avDiGuida; 24.12.2012
comment
@avDiGuida Как я уже упоминал в своем ответе, лучшая благодарность - отметить ответ на вопрос, если мой ответ решил вашу проблему :-) - person Colin T Bowers; 24.12.2012