-1
capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))

そのコードを使用すると、コードが実行できず、次のコマンドのようなコマンドがあったのはなぜですか?

??? Array dimensions must match for binary array op.
4

1 に答える 1

1

これらはすべて、Matlab のドキュメントを介して見つけることができます。これは、常に最初のステップである必要があります。

そうは言っても、コマンドの内訳は次のとおりです。

cell2mat: 定義した形式に従ってセル配列を行列に変換します

arrayfun: 配列内のすべての要素に対して関数を評価します。関数は無名関数の場合があります (例: @(b) sum(resulti == b,1))

sum: 行列のすべての要素を特定の方向に合計します。方向 1: 行に沿って、方向 2: 列に沿って、など。

nonzeros: 入力配列からすべてのゼロを削除して、新しい配列を形成します。これは、入力の形状に関係なく、列ベクトルを出力します。

unique: すべての値のすべての重複が削除された入力配列を返します。出力もソートされます。

help [command]これらすべてのコマンドの詳細については、またはと入力doc [command]してください (実行することをお勧めします)。

次に、これらをコマンドに組み合わせます。

A = nonzeros(unique(resulti))

ゼロを削除して、列ベクトル内のすべての一意のエントリを返します。

B = arrayfun(@(b)sum(resulti==b), A, 'UniformOutput', false)

@(b) sum(resulti == b,1)新しく作成された列ベクトル のすべてのエントリに対して関数を実行し、それらをセル配列(セル、 に設定されているため)Aに収集します。この関数は、 の各要素を実行中の indexと単純に比較し、行に沿って合計数を見つけます。そして、最後に、B'UniformOutput'falseresultib

capi = cell2mat(B)  

cell-arrayBを通常の Matlab 配列に変換します。

このコマンドの目的は、の各列で一意でない出現回数をカウントすることのようですresulti。@GuntherStruyf で示唆されているように、このコマンド全体は、管理しやすく読みやすいコードではなく、ハッキングされた強制的なワンライナーのようです。arrayfun個人的には、複数の行に分割し、 (遅い) を避けて、代わりにbsxfunorforループを使用することを選択します (より高速 (はい、-ループもfor)、読みやすくなります)。

しかし、それは意見の問題です(これは世論に反します:)

于 2012-08-03T09:06:06.600 に答える