2017-01-11 2 views
0

1つの大きなセルがN×1次元あります。各行は文字列か二重のいずれかです。文字列は変数名であり、連続した2倍は次の文字列(別の変数名)までの値です。たとえば、2つのインデックスの配列を持つcellfun

data = { 
var_name1; 
val1; 
val2; 
val3; 
val4; 
val5; 
var_name2; 
val1; 
val2; 
var_name3; 
val1; 
val2; 
val3; 
val4; 
val5; 
val6; 
val7} 

などです。私は3つのセルにデータセルを分離したい。 {var_nameとその5つの値}、{var_nameとその2つの値}、{var_nameとその7つの値}。私は可能な限りループしないようにして、cellfunと一緒にベクター化が本当にうまく機能することを見出しました。出来ますか?データセルには、100万行近くあります。

+0

「indx_last」はサイズが1なので、どの「ループ」でも同じですか? – Suever

答えて

0

私は次のことが後になっていると思います。主要な部分は、cumsumを使用して、各行が対応する名前を確定し、次にaccumarrayを使用して名前ごとにリストを作成します。

% Make some data 
data = {'a'; 1; 2; 3; 
    'b'; 4; 5; 
    'c'; 6; 7; 8; 9; 
    'd'; 
    'e'; 10; 11; 12}; 

% Which elements are the names? 
isName = cellfun(@ischar, data); 

% Use CUMSUM to work out for each row, which name it corresponds to 
whichName = cumsum(isName); 

% Pick out only the values from 'data', and filter 'whichName' 
% for just the values 
justVals = data(~isName); 
whichName = whichName(~isName); 

% Use ACCUMARRAY to build up lists per name. Note that the function 
% used by ACCUMARRAY must return something scalar from a column of 
% values, so we return a scalar cell containing a row-vector 
% of those values 
listPerName = accumarray(whichName, cell2mat(justVals), [], @(x) {x.'}); 

% All that remains is to prepend the name to each cell. This ends 
% up with each row of output being a cell like {'a', [1 2 3]}. 
% It's simple to make the output be {'a', 1, 2, 3} by adding 
% a call to NUM2CELL on 'v' in the anonymous function. 
nameAndVals = cellfun(@(n, v) [{n}, v], data(isName), listPerName, ... 
    'UniformOutput', false); 
0

cellfunは、セルの各エレメントに機能を適用するためのものです。

あなたがそのようなcellfunに複数の引数を渡すと、それはdataindx_first、およびindx_lasti番目の引数を取り、そして匿名関数でそれらのそれぞれを使用しています。これらの変数を代入すると、関数がdataにあり、関数がx(y : z)と評価されます。つまり、data{i}(y : z)を実行しています。つまり、実際のの要素をセル配列のインデックスにするのではなく、インデックスすることです。私はそれがあなたが望むものだとは思わない。実際にdata{y : z}が必要です。(y, z)ペアのそれぞれ対応する要素は、indx_firstindx_lastです。

本当にそうであれば、私はあなたの問題を解決するベクトル化された方法を見ません。それぞれの "変数"はサイズが違うからです。しかし、あなたはどれくらい多くの変数を持っているか知っています。これは、サイズがindx_firstです。だから、私はあらかじめ割り振ってループしています。

最後に2列のセル配列があります。各行の最初の列は変数の名前です。 2番目は実際のデータです。私。

{'var_name1', [val1 val2 val3 val4 val5]; 
'var_name2', [val1 val2]; 
. 
. 
. 
関連する問題