2017-08-14 9 views
0

ベクトルの長さが異なる作業領域のベクトルがあります。私はベクトル名を含む文字列セルを持っています。私はこれらのベクトルの長さを吐き出すためにcellfunを使いたい。例えばセルの名前が格納されているベクトルの長さの比較

t1 = 1x10 double 
t2 = 1x100 double 
t3 = 1x20 double 
cel = {'t1','t2','t3'}; 

cellfun(@(c) eval(['length(',c{:},')']),cel) 

は私が仕事をする次のことをやって思ったが、それはしていません。私はこの問題に対してcellfunとevalを使う必要がある理由があります。

誰かが間違っていることを指摘できますか?エラーメッセージは次のとおりです。

cellfun(@(c) eval(['length(',c{:},')']),cel) 
Cell contents reference from a non-cell array object. 

cellfun(@(c) eval(['length(',c(:),')']),cel) 
Error using horzcat 
Dimensions of matrices being concatenated are not consistent. 

cellfun(@(c) eval(['length(',[c{:}],')']),yvar) 
Cell contents reference from a non-cell array object. 

以上。最終目標は、すべてのベクトルの長さが同じかどうかを確認することです。ルーピングなしでそうする方法があれば、それは素晴らしいことです。

+0

これはあなたのコードを変更する大きな理由は 'eval'を必要としないからです。また、 'cellfun'はループです。ほとんどの場合、明示的なループよりも遅いので、実際には何も保存していません。 – excaza

+0

すばらしい情報ありがとうございました。 – Eric

答えて

0

あなたはwhos

L={} 
for ct = 1:length(cell) 
    w=whos(cel{ct}); 
    L{ct} = w.size; 
end 

を使用することができると私はコメントに同意します。不自解な回避策が必要ないようにコードを書き直してください。

2

私はcellfunevalをこの問題に使用する必要がある理由があります。

この質問、および従ってくださいある質問、幻想的な理由ないevalを使用することです。これまでこれまでずっと。デバッグが難しく、遅いです(eval文はMATLABのJITコンパイラによって無視されます)。例えば

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
t4 = rand(1, 1, 20); 
cel = {'t1', 't2', 't3', 't4'}; 

ws = whos(); 
tmp = {ws.name}; 
sizes = {ws(ismember(tmp, cel)).size} 

あなたは絶対に、完全に、真剣に(非常に稀にしか存在しない状況を)eval使用を避けることができない場合は

、あなたは一緒にwhosのオプションの出力を使って何かを考え出すことができます一致する変数のサイズのセル配列を返します。これを使用して、必要な解析を行うことができます。

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
cel = {'t1', 't2', 't3'}; 

ws = whos(); 
tmp = {ws.name}; 
sizes = reshape([ws(ismember(tmp, cel)).size], 2, []).'; 

whosregular expressionsをサポートしています。あなたはあなたのデータは2次元のみになるだろうことがわかっている場合は

、あなたはそれを視覚的に容易に解析可能なものにサイズの配列への情報とreshapeをドロップすることができますこれにより、セル配列に値を設定するのではなく、パターンに基づいて変数をマッチさせることができます:

t1 = rand(1, 10); 
t2 = rand(1, 100); 
t3 = rand(1, 20); 
v1 = rand(1, 30); 
time = rand(1, 5); 

ws = whos('-regexp', 't\d+'); 
tmp = {ws.name}; 
sizes = reshape([ws.size], 2, []).'; 
+0

私はevalを使用しないよう努力しています。私の巨大なコードではまれなケースです。ありがとうございました。 – Eric

関連する問題