各セルがn行n列の行列であるセル配列があります。inv(cell{i}'*cell{i})
行列が特異に近いことを警告するセルを削除したいと思います。ありがとうございました
質問する
1767 次
3 に答える
3
一般的に、要素の削除は簡単な部分です。が配列の場合C
、ベクトルのインデックスで指定されたセルを削除するには、次の方法がありますidx
。
C(idx) = {};
特定の問題に関して、行列が「ほぼ」特異であるかどうかを確認するには、を使用できますrcond
(結果がゼロに近い場合は、おそらく特異です)。cellfun
すべてのセルに適用するには、次の方法で使用できます。
idx = cellfun(@(x)(rcond(x' * x) < 1e-12), C);
しきい値をお好みに合わせて調整してください。結果は、特異行列の位置にsをidx
持つ論理配列になります。上記のように、これらの要素をから削除するために1
使用します。idx
C
于 2013-01-15T15:19:29.777 に答える
1
状態をチェックする関数を作成します。
function state = CheckElement(element)
if ([condition])
state = 1;
else
state = 0;
end
end
次に、次のようにすべてのセル配列要素に対してcellfunを実行します。
indices = cellfun(@CheckElement,myCellArray);
cellArray(indices ) = [];
于 2013-01-15T15:20:46.220 に答える
0
issingular
定義済みの関数がすでに定義されていると仮定するとcellfun
、削除する行列を含むセルのインデックスを取得するために使用できます。
c; % cell arry
singularIdx = cellfun((@x) issingular( inv(x' * x)), c); %' added single quote for SO syntax
cFiltered = c(~singluarIdx);
特異点をチェックするために独自の関数を作成する必要があります。詳細については、次の質問を参照してください。行列が特異であるかどうかをチェックする高速な方法?(非可逆、det = 0)
于 2013-01-15T15:20:05.257 に答える