3

bsxfun 関数を理解しようとした後、ループを避けるためにスクリプトに実装しようとしました。配列内の個々の要素が 1 つの行列に含まれているかどうかを確認しようとしています。それぞれ 1 と 0 を含む初期配列と同じサイズの行列を返します。私が作成した匿名関数は次のとおりです。

myfunction = @(x,y) (sum(any(x == y)));

x は、言うまでもなく「受け入れられる値」を含むマトリックスです。y は入力配列です。これまでのところ、bsxfun 関数を次のように使用してみました。

dummyvar = bsxfun(myfunction,dxcp,X)

myfunction が無名関数のハンドルと等しいこと、およびこれを達成するために bsxfun を使用できることは理解していますが、次のエラーの理由がわかりません:

Non-singleton dimensions of the two input arrays must match each other. 

次のテストデータを使用しています。

dxcp = [1 2 3 6 10 20];
X = [2 5 9 18];

出力が次のようになることを願っています。

dummyvar = [1,0,0,0]

乾杯、NZBRU。

編集:15担当者に達したので、回答を更新しました

4

2 に答える 2

4

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() が (平均して) 高速であることを意味します。

于 2014-04-26T13:36:26.537 に答える
0

要素のすべての組み合わせがany(x == y)テストにスローされるのではなく、テストされた各要素dxcpが に存在するかどうかを確認する必要がありXます。これは短いバージョンで、転置も必要ありません。ベクトル化も よりも少し速くなるはずですbsxfun

arrayfun(@(el) any(el == X), dxcp)

結果は

ans =

     0     1     0     0     0     0
于 2014-04-26T13:51:03.697 に答える