#author("2019-06-21T11:40:10+09:00","default:Miyashita","Miyashita") #author("2019-10-10T16:43:14+09:00","default:Miyashita","Miyashita") *セル配列の操作 メモ [#x2c8f675] セル配列Aがあるとする.~ #contents **基本 [#g2515e16] セル配列は文字列も数値も格納できる.処理は速くないらしいが扱いやすい.~ 原則,下記のように2種類の表記ができる.慣れるまでややこしい.~ セル配列Aがあるとすると,原則下記のように2種類の表記ができる.慣れるまでややこしい.~ ~ #codeprettify(lang-matlab){{ A(xx,xx) A{xx,xx} }} ()の括弧は配列をセルとして取り出すもの,~ {}の括弧はセルの括弧を外し,配列の中身自体を見るものだと思っておけば良い.~ A{xx,xx}はセルの括弧を外しているので,cell2matは不要.~ セルの中にセルを入れることもできるので,どれに着目しているのかは注意を払う必要がある.~ ~ **セル配列の作成 [#y015da79] ny行nx列のセル配列を作成する.各要素には空行列が入る. &codeprettify(lang-matlab){A = cell(ny,nx);}; ~ **セル配列の削除 [#z4f57147] セルの配列自体を消す.下記は5行目以降消したいとき. &codeprettify(lang-matlab){A(5:end,:) = [];}; ~ **セル配列の要素の中身を削除 [#nb98c93f] セルのある要素の中身を消す.下記の操作後も,配列Aの要素数は変わらずに,消した要素には空行列が残る. &codeprettify(lang-matlab){A{row,col} = [];}; ~ **セルから数値のmatrixに変換 [#hf5a41e6] 全て数値で中身がmatrixになっていれば可能. &codeprettify(lang-matlab){AA = cell2mat(A(row,col));}; ~ **セルの配列の結合 [#d73a354c] 互いに1行か1列で列数と行数が一致していれば可能. #codeprettify(lang-matlab){{ AA = vertcat(A{:,col}); BB = horzcat(A{row,:}); }} ちなみにN行1列のセルで &codeprettify(lang-matlab){A = vertcat(A);}; だと何も起きず, &codeprettify(lang-matlab){A = vertcat(A{:});}; にすると全部統合されて1つのmatrixになった.~ また,セルの中身が全て同じサイズの2次元配列 (ny, nx) で,セル配列 (Nx1) を3次元目の配列 (ny, nx, N) としたい場合は下記の通り. #codeprettify(lang-matlab){{ A = cat(3, A{:}); % 3は 3次元目の意. }} ~ **セル配列の要素ごとに同じ関数を適用 [#ua4a48a0] for文を使わずにセルの中で同じ処理を実行したいときに,cellfunが利用できる.~ 下の例は,セル要素の中身が空かどうか(isempty)をそれぞれの要素で実行したもの. #codeprettify(lang-matlab){{ >> A = cell(2,2); >> b = cellfun(@isempty,A) b = 2×2 logical array 1 1 1 1 >> A{2,1} = zeros(5,5); >> b = cellfun(@isempty,A) b = 2×2 logical array 1 1 0 1 }} 関数を渡すのに@を忘れないように.~ @で自作の関数を定義すればそれを利用することもできる.~ ~ 複数の入力引数がある function を cellfun へ渡すときは,下記のようにする. #codeprettify(lang-matlab){{ % 利用可能なフォント一覧を取得, Nx1 のセル配列 fonts = listfonts; % セル配列の中に 'Times' という文字列が含まれているかを判定 array_logical = cellfun(@(x) contains(x,'Times'), fonts); }} このように, @(x) function_name(x,args) とすることで,セルの中身を x をとして入力する無名関数ができる.