Divakar から提供されたソリューションがどのように機能するかを理解したので、これを更新すると思いました。これは、私の最初の質問を読んで bsxfun() がどのように機能するかについて混乱している他の人からの混乱を思いとどまらせるかもしれません。それを書いておくと、私もそれをよりよく理解するのに役立つと思います.
注: 以下は正しくない可能性があります。この 1 つのケースを見て、関数がどのように動作するかを理解しようとしました。
bsxfun 関数への入力は、dxcp と X 転置でした。使用された関数ハンドルは @eq だったので、各要素が比較されました。
%%// Given data
dxcp = [1 2 3 6 10 20];
X = [2 5 9 18];
次のコード:
bsxfun(@eq,dxcp,X')
最初の入力変数である dxcp のすべての値を X' のすべての行と比較しました。次のマトリックスは、この出力です。
dummyvar =
0 1 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
最初の要素は、1 と 2 dxcp = [ 1 2 3 6 10 20] を比較することで見つかりました。X' = [ 2 ;5;9;18];
最初の行に沿った次のものは、2 と 2 dxcp = [1 2 3 6 10 20] を比較することによって見つかりました。X' = [ 2 ;5;9;18];
これは、X' の最初の行と比較される dxcp のすべての値まで繰り返されました。このロジックに従って、2 行目の最初の要素は次の比較を使用して計算されました。X' = [2; 5 ;9;18];
提供された最終的な解決策は any(bsxfun(@eq,dxcp,X'),2) で、これは any(dummyvar,2) と同等です。http://nf.nci.org.au/facilities/software/Matlab/techdoc/ref/any.htmlは、任意の機能を詳細に説明しているようです。基本的に、次のように言います。
A = [1,2;0,0;0,1]
次のコードが実行された場合:
result = any(A,2)
関数 any は、各行にゼロ以外の要素が 1 つまたは複数含まれているかどうかをチェックし、含まれている場合は 1 を返します。この例の結果は次のようになります。
result = [1;0;1];
2 番目の入力パラメーターが 2 に等しいためです。上記の行が result = any(A,1) に変更された場合、各列がチェックされます。
このロジックを使用すると、
result = any(A,2)
最終結果を得るために使用されました。
1
0
0
0
必要に応じて、等しいに転置できます
[1,0,0,0]
パフォーマンス - 次のコードを実行した後:
tic
dummyvar = ~any(bsxfun(@eq,dxcp,X'),2)'
toc
期間は次のとおりであることがわかりました。
Elapsed time is 0.000085 seconds.
以下の代替:
tic
arrayfun(@(el) any(el == dxcp),X)
toc
arrayfun() 関数 (配列の各要素に関数を適用する) を使用すると、次のランタイムが発生しました。
Elapsed time is 0.000260 seconds.
^上記の実行時間は、5 回の実行の平均であり、この場合は bsxfun() が (平均して) 高速であることを意味します。