3

我正在使用一个单元格数组以包含 1x2 网格位置向量的形式[row, col]。我想检查此单元格数组中是否包含另一个网格位置。

不幸的是,我当前的代码导致错误,我不太明白为什么:

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

其中player.rowplayer.col是整数,并且proximity的第一列是前面提到的网格位置元胞数组

我收到的错误是:

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

不幸的是,我无法找到有关ismember()以这种方式使用的任何信息,只能将单元格数组作为字符串或在每个单元格中使用单个整数而不是向量。

我考虑过使用num2str()and进行转换str2num(),但由于我必须在转换之间执行计算,并且由于迭代次数的原因,代码将被循环(10,000 次循环,每个循环 4 次转换),这种方法似乎令人望而却步。

在这里的任何帮助将不胜感激,谢谢

编辑:为什么会ismember()返回此错误?它是否将元胞数组中的所有向量都视为字符串数组?

编辑:是否有更好/更有效的方法来确定 1 是否在返回的向量中

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

4

1 回答 1

2

我现在时间不多(作为 Chrissy eve 和所有),所以这将是一个非常快速的答案。

据我了解,问题是查找 xy 坐标是否位于许多 xy 坐标的序列中,如果是,则查找它所在位置的索引。如果是这种情况,并且如果您对效率感兴趣,那么弄乱字符串或单元数组是很浪费的。您应该为此使用数字矩阵/向量。

所以,我的建议:将单元格数组的第一行转换为数值矩阵。然后,将您的 xy 坐标与此数字矩阵的行进行比较。因为您只想知道两个坐标何时与数值矩阵的一行匹配,所以使用'rows'选项ismember- 它只会在匹配整行而不是匹配单个元素时返回 true。

一些希望对您有所帮助的示例代码如下:

%# 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.

还有一件事,我注意到你是新成员,所以欢迎来到这个网站。如果您认为此回复令人满意地回答了您的问题,请单击此回复旁边的勾号标记已回答的问题。

于 2012-12-24T05:01:55.620 回答