a = 5
番号付きの変数 (つまり、 、) を含む入力ファイル (.m ファイル) があるかどうかを MATLAB に教えてもらい、b = 6
そのc = 7
.m ファイルを別のプログラム (メインの .m ファイル) で使用できるようにしたいと考えています。これらの変数を使用して を計算しますS = a + b + c
。メインファイルから入力ファイルを読み取るにはどうすればよいですか? 入力ファイルの名前は INP で、メインの MAIN とします。
6 に答える
これは通常、MATLAB では適切な方法ではありません。入力変数を含むファイルは、この例ではスクリプトになります。あなたのメインファイルと同じように。ScottieT812 で示唆されているように、あるスクリプトから別のスクリプトを実行しても MATLAB はエラーになりませんが、特定の状況では奇妙なエラーが発生する可能性があります。(実行時のコンパイルには問題があり、スクリプト間で変数名が衝突します)
より良いオプションは、入力スクリプトを目的の変数を返す関数に変えることです
function [a,b c] = inputs
a = 5;
b = 6;
c = 7;
次に、この関数を main.m スクリプトで呼び出すことができます。
% main.m
[a,b,c] = inputs;
s = a+b+c;
この種のもの (後で簡単に調整できるパラメーター) には、ほとんどの場合、構造を使用します。
function S = zark
S.wheels = 24;
S.mpg = 13.2;
S.name = 'magic bus';
S.transfer_fcn = @(x) x+7;
S.K = [1 2; -2 1];
次に、 [a,b,c,d,e,f]=some_function; のようなことをしなくても、たくさんのデータを返すことができます。
構造体の優れた点の 1 つは、動的にアドレス指定できることです。
>> f = 'wheels';
>> S.(f)
ans =
24
「入力」ファイルが m ファイルの場合は、「メイン」m ファイルでそのファイルの名前を使用します。たとえば、次のような input.m というファイルがあるとします。
% File: inputs.m
a = 5;
b = 6;
c = 7;
次に、ファイル main.m で次のように使用できます。
% File: main.m
inputs;
S = a + b + c;
スクリプトで使用されるグローバル構成情報が必要なようです。多くの場合、関数を作成して引数として値を渡す方がはるかに優れていますが、提案された方法で物事を行うことが理にかなっている場合もあります。これを実現する 1 つの方法は、情報をファイルに保存することです。Matlab ドキュメントの「ロード」と「保存」を参照してください。
私の仕事用に MATLAB ソフトウェアのランタイム コンパイル バージョンを作成しようとしたときに、KennyMortonが言及した正確な問題に遭遇しました。ソフトウェアは、関数間で引数を渡すために m ファイルを広範囲に使用します。さらに、展開されたバージョンの MATLAB では適切に機能しないこれらの m ファイルを動的に作成します。私たちの回避策は次のとおりです。
- パラメータを .m 拡張子なしでファイルに保存します
- ファイルの内容を読み取って評価する
したがって、OP の例に従うと、関数内でパラメーターを含むテキスト ファイル INP を作成します。ctfroot関数によって返されるディレクトリにこのファイルを作成します。次に、MAIN で、以下を使用してこれらのパラメーターを取得します。
eval(char(textread(fullfile(ctfroot, INP), '%s', 'whitespace', '');
データ スクリプトが単なるスクリプトの場合は、関数または別のスクリプトから直接呼び出すことができます。余分なコマンドは必要ありません。例えば:
%mydata.m
a = 1;
b = 2;
%mymain.m
mydata
whos
mymain
>>
mymain
名前 サイズ バイト クラス属性
a 1x1 8 ダブル
b 1x1 8 ダブル
これは、スクリプトに加えて関数にも機能します
%foo.m
function foo mydata
whos
>>
foo
名前 サイズ バイト クラス属性
a 1x1 8 ダブル
b 1x1 8 ダブル
一般に、この種のものには、MAT またはその他のデータ ファイルを使用することをお勧めします。