capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))
そのコードを使用すると、コードが実行できず、次のコマンドのようなコマンドがあったのはなぜですか?
??? Array dimensions must match for binary array op.
capi = cell2mat(arrayfun(@(b) sum(resulti == b,1),nonzeros(unique(resulti)), 'UniformOutput', false))
そのコードを使用すると、コードが実行できず、次のコマンドのようなコマンドがあったのはなぜですか?
??? Array dimensions must match for binary array op.
これらはすべて、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'
false
resulti
b
capi = cell2mat(B)
cell-arrayB
を通常の Matlab 配列に変換します。
このコマンドの目的は、の各列で一意でない出現回数をカウントすることのようですresulti
。@GuntherStruyf で示唆されているように、このコマンド全体は、管理しやすく読みやすいコードではなく、ハッキングされた強制的なワンライナーのようです。arrayfun
個人的には、複数の行に分割し、 (遅い) を避けて、代わりにbsxfun
orfor
ループを使用することを選択します (より高速 (はい、-ループもfor
)、読みやすくなります)。
しかし、それは意見の問題です(これは世論に反します:)