2016-05-25 4 views
0

.matファイルからデータをプロットするときに、スクリプトから行を1つずつ入力すると、スクリプトを実行しようとすると失敗します。Matlab関数が 'Evalを使用したエラー'で失敗しました。コマンドウィンドウで使用するとうまく動作します

function Test (filename) 

    varname = load (filename) %or load filename              
    matObj = matfile(filename); 
    varlist = who (matObj); %or varlist = fieldnames (varname) 
    field1 = eval (varlist {1}) 
    field2 = eval (varlist {2}) 
    x1 = field1.x_values.start_value:field1.x_values.increment:field1.x_values.increment*field1.x_values.number_of_values; 
    x2 = field2.x_values.start_value:field2.x_values.increment:field2.x_values.increment*field2.x_values.number_of_values; 
    figure 
    hold all 

    %Support for yyaxis left/right not avaiable, so use plotyy 
    plotyy (x1, field1.y_values.values, x2, field2.y_values.values) 

end 

Iスクリプト(テスト( '1.matを'))を呼び出す場合、MATLABがFIELD1 =行にエラーを示します。

Error using eval 
    Undefined function or variable 'Signal'. 

を '信号が' データ・セットの1つです1.matファイル内の名前。

興味深いことに、コマンドウィンドウから同じ順番で各行を実行すると、エラーは発生せず、プロットが表示されます。現在のパスにスクリプトと1.matファイルがあることを確認しましたが、スクリプトから実行したときに評価が不満な理由を理解できません。

答えて

2

あなたのmatObjSignalという名前の変数を含む*.matファイルであるために問題が発生しています。関数内で(loadを使用して)ファイルをロードすることはありませんが、代わりにmatfile objectmatObjに割り当てます。このから変数を読み取るにはevalこれまでのを使用しないでください。オブジェクトにdynamic fields referencingを使用します。一般的に

field1 = matObj.(varlist{1}); 
field2 = matObj.(varlist{2}); 

しかし、あなたはおそらくあなたがファイルからロードしようとしているのではなく、単にあなたがwhoで見つける最初の2つの変数を使用している変数の名前を知っている必要があります。その場合は、そのまま直接使用してください。いくつかの時点で、あなたはおそらくに(Signalを含む)すべてのそれの内容をロードしているだろうloadを使用してコマンドウィンドウのワークスペースに.MATファイルをロードしているため

field1 = matObj.Signal; 

あなたのコードは、おそらくコマンドウィンドウで働いていた理由は、ワークスペース。

load('filename.mat') 

ニット・ピックのビットとしても。 関数(先頭にfunctionという定義があります)のスクリプトはありません。これはあなたの問題を診断するために大きな影響を与えます。 をテストすることはできません機能機能の範囲が異なるため、コマンドウィンドウに項目をコピー/貼り付けします。

+0

ありがとうございました!関数対スクリプトはちょっと混乱します。スタンドアロンのexeファイルを作成するには、常にトップレベル.mファイルを関数を含むファイルに設定します。その後、ウィンドウのコマンドラインから、私は.exeを実行し、関数に必要な引数を渡すことができます。トップレベルの.mファイルとしてスクリプトを使用して同じことを達成できますか?引数はどのように渡されますか? – ben

関連する問題