我正在使用一个单元格数组,以[row, col]
的形式包含网格位置的1x2向量。
我想检查此单元格数组中是否包含另一个网格位置。
不幸的是,我当前的代码导致错误,我不太明白为什么:
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(...))
?
答案 0 :(得分:2)
我现在缺少时间(正是Chrissy前夕和所有人),所以这将是一个非常快速的答案。
据我了解,问题是找到x y坐标是否位于许多x y坐标的序列中,如果是,则指出它所在的索引。如果是这种情况,并且如果您对效率感兴趣,那么乱用字符串或单元格阵列就很浪费。你应该使用数字矩阵/向量。
所以,我的建议是:将单元格数组的第一行转换为数字矩阵。然后,将x y坐标与此数值矩阵的行进行比较。因为您只想知道两个坐标何时匹配数字矩阵的一行,所以使用'rows'
的{{1}}选项 - 它仅在匹配整行时返回true,而不是匹配单个元素。
一些示例代码可能会有所帮助:
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
。
另外一件事,我注意到你是新成员,所以欢迎访问该网站。如果您认为此回复令人满意地回答了您的问题,请通过单击此回复旁边的勾号来标记回答的问题。