4

各セルがn行n列の行列であるセル配列があります。inv(cell{i}'*cell{i})行列が特異に近いことを警告するセルを削除したいと思います。ありがとうございました

4

3 に答える 3

3

一般的に、要素の削除は簡単な部分です。が配列の場合C、ベクトルのインデックスで指定されたセルを削除するには、次の方法がありますidx

C(idx) = {};

特定の問題に関して、行列が「ほぼ」特異であるかどうかを確認するには、を使用できますrcond(結果がゼロに近い場合は、おそらく特異です)。cellfunすべてのセルに適用するには、次の方法で使用できます。

idx = cellfun(@(x)(rcond(x' * x) < 1e-12), C);

しきい値をお好みに合わせて調整してください。結果は、特異行列の位置にsをidx持つ論理配列になります。上記のように、これらの要素をから削除するために1使用します。idxC

于 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 に答える