プロが教えるわが家の防犯対策術!

MATLABプログラミングについて質問です。

毎回同じフォーマットの実験データが出力されるので、個々のデータをあるファンクションでグローバル変数として宣言→実験ファイルのロード、という動きになるように書いたつもりなのですが、
「Undefined function or variable xxxx」(xxxxは私の宣言したはずのグローバル変数)というエラーメッセージが表示されてしまいます。
どう直したらよいのか教えていただけないでしょうか。

私の書いたプログラミングの構成は以下のような感じです。

1. メインのmファイルでグローバル変数を定義するためのfunc1を呼び出す。
2. func1でグローバル変数をひたすら定義。宣言の仕方はオフィシャルサイトと同じ。
  global data1;
  global data2;
  global data3;
3. メインのファイルから実験データをロードする。実験データはmファイル内に宣言した
  グローバル変数と同じ名前の変数に代入するような記載になっています。
  data1 = 0.005;
  data2 = 2800;
  data3 = 1.242;

なお、実験結果のmファイルの読み込みだけ単体で実行するとワークスペースに変数とその値が表示されるので、3.ロード の記載が間違っているとは思えません。

宜しくお願いします。

A 回答 (4件)

MATLAB は、マスワークス社のサポート部隊が充実しているし、また同社が MATLAB 質問用の掲示板を立ち上げているから、そのどちらかに質問した方が良いと思うよ。

    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。ただ、個人のライセンスでないので、mathworksに問い合わせられなくて。

お礼日時:2019/03/02 08:06

こんばんは。


私自身の簡単なプログラムで確認して見ましたが、上記のエラーは発生せずに、globalになっていることも確認できました。(変数がglobalか否かは "who global⏎"で確認できます。

多分、質問の所の1.と2.あたりがうまく動作していないのではないですか?。
>「Undefined function or variable xxxx」が出ているということはmファイルでdata1,data2,data3という変数は知らないと言っているのでしょうね。

私の確認したプログラムで良ければ、情報提供しますので、私のプログラムと自分のプログラムの違いを見る、私のプログラムをglobal変数宣言の所をコメント文にして、どうなるかを調べて見ますか?。

ご自分のプログラムで、実験ファイルのロードをせずに、グローバル変数を定義し、単純に質問の1,2,3の部分だけでも、同じ様に「Undefined function or variable xxxx」が出ますか?。
→折角、宣言したのに、ロード作業中に何か変わっているものはないかを疑っています。

質問文からすると、特に問題なし、質問者様のプログラミング能力からすると、下手なドジは踏んでいる様には思えませんが。。。
    • good
    • 1
この回答へのお礼

ご丁寧にありがとうございます。
同一ファイルで宣言(global data1;...)と代入(data1 = 0.5;...)を行なったところ、警告(*)は出ましたがワークスペースに変数も値もセットされました。

デバッグで動きを見たところ、グローバル変数の宣言後までは期待通りの動きですが
[file, path] = uigetfile({'*.m'},'File Selector'); で実験結果ファイルを選択直後、ワークスペースがリセットされ(グローバル変数が消え、ファイル選択のために使ったこの関数の変数、file, pathがワークスペースに出現)したので、これが原因かもしれません。

できたら汎用性を持たせたいので実験結果ファイルはユーザに都度任意選択できるものが良いと思いましたが、これが原因なら諦めようと思います。

にんたまくんさんは、loadで読み込みを行いましたか?
お忙しいところ申し訳ありません。もしくは、問題ないようでしたら、スクリプトを拝見させていただけないでしょうか。(この場合は自分で読みます)

宜しくお願いいたします。

お礼日時:2019/03/02 08:19

> 個人のライセンスでないので、mathworksに問い合わせられなくて。



できます。会社のライセンスでも、学校のライセンスでも、研究室のライセンスでも、ライセンス番号があって保守契約が生きていれば、マスワークスは対応してくれます。
    • good
    • 0
この回答へのお礼

言葉足らずですみません。学校に問い合わせても、ITサポートと教務課でたらい回しでライセンス番号含む契約情報を教えてもらえない状況です。

お礼日時:2019/03/02 08:32

No.2です。


>デバッグで動きを見たところ、グローバル変数の宣言後までは期待通りの動きですが
ここはOKですね。
>[file, path] = uigetfile({'*.m'},'File Selector'); で実験結果ファイルを選択直後、ワークスペースがリセットされ
>(グローバル変数が消え、ファイル選択のために使ったこの関数の変数、file, pathがワークスペースに出現)したので、これが原因かもしれません。
その様ですね。
>にんたまくんさんは、loadで読み込みを行いましたか?
loadなしです。ワークスペースリセット後、再度、グローバル変数を再宣言とかはできないのでしょうか(ここは今、アドリブ的な考えです。)

>お忙しいところ申し訳ありません。もしくは、問題ないようでしたら、スクリプトを拝見させていただけないでしょうか。
>(この場合は自分で読みます)

お恥ずかしいくらい簡単なプログラムですよ。
私の方はloadなしで問題なし。質問者様はloadありで、エラー発生。あなたのNo.2コメントの予測原因が問題なのでしょうね。

何か、不明ありましたら、追加コメント下さい。私の回答できる範囲であれば回答します。


プログラムは以下です。
******** main ******** (main_test.m)
clear
#grobal data1
#grobal data2
#global data3
x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a=1
func1(a)
data1 = 0.005;
data2 = 2800;
data3 = 1.242;
who global; ←ここはglobal変数が何かを表示されるコマンドです。
data1
data2
data3
**************************

********* sub1 ******** (func1.m)
function y = func1(x)
global data1;
global data2;
global data3;
y = x;

end
************************
    • good
    • 0
この回答へのお礼

ご説明ありがとうございます。
グローバル変数を再宣言は元々していません。そして、ちょっとよく分からないですが、実験データファイルの取り込み([file, path] = uigetfile({'*.m'},'File Selector');.....)を呼び出す関数内ではなく、メイン関数でやったらうまく動きました。

いろいろとアドバイスありがとうございました。

お礼日時:2019/03/03 06:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!