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()このエラーを返すのですか? セル配列内のすべてのベクトルを文字列配列として扱いますか?

EDIT: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

もう 1 つ、あなたが新しいメンバーであることに気付きました。サイトへようこそ。この回答が質問に対する十分な回答であると思われる場合は、この回答の横にあるチェック マークをクリックして、回答済みの質問をマークしてください。

于 2012-12-24T05:01:55.620 に答える