8

matlab セル配列の下部にあるすべての空のセルを削除したいと考えています。ただし、私が見つけたすべてのコード例は、マトリックスをベクトルに折りたたんでいますが、これは私が望むものではありません。

だからこのコード

a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 
a(emptyCells) = []

このベクトルの結果

a = [1] [3] [2] [4]

しかし、代わりにこの配列が欲しい

a =

[1]    [2]

[3]    [4]

どうすればいいですか?

4

4 に答える 4

17

すべてのセルが空のセル配列内のすべての行を削除する場合は、次を使用できます。

a = { 1, 2; 3, 4; [], []}
emptyCells = cellfun('isempty', a); 

a(all(emptyCells,2),:) = []

a = 
    [1]    [2]
    [3]    [4]

定式化で機能しなかった理由は、配列でインデックスを付けると、出力がベクトルに再形成されるためです (行または列全体が削除されるという保証はなく、どこかの個々の要素だけではないため)。

于 2012-03-14T15:09:15.917 に答える
1

と呼ばれる、セルから特定の行/列を削除することを一般化する関数がありますfun_removecellrowcols。削除により、セルのサイズが変更されます。

于 2014-04-25T10:13:39.310 に答える
1

これは私のために働く:

a = { 1, 2; 3, 4; [], []};
emptyCells = cellfun('isempty', a);
cols = size(a,2);
a(emptyCells) = [];
a = reshape(a, [], cols);

しかし、それがあなたにとって十分に一般的かどうかはわかりません-配列の下部に常に空のセルの完全な行がありますか?

于 2012-03-14T09:27:37.647 に答える
0

問題に非常に固有のより簡単な解決策は、セルを直接マトリックスに変換することです。

cleanedA = cell2mat(a);

通常のマトリックスに変換し、これを行う間に空のセルを削除します。

もちろん、次のコマンドを使用してセル配列に再変換できます。

a = mat2cell(cleanedA, [1 1], [1 1])

一般的ではありませんが、投稿された例では、私が考えることができる最も簡単な解決策です。

于 2012-03-14T10:41:30.990 に答える