4

matlab ガイドを使い始めると、つまずきにぶつかります。私の問題を説明するために、おもちゃのGUIとしてできる限り簡単にしました。gui (asas という名前) には、プッシュボタンと軸があります。ボタンのコールバックは読み取ります

axesHandle= findobj(gcf,'Tag','axes1');
x=rand(randi(10+20,1),4);
plot(axesHandle, x)

私が書いた他のコードはありません(ガイドが書きました)。
初めてボタンを押したときは、すべて問題ありません。プロットが完了しました。2 回目は、コンソールから次のエラーが表示されます。

Error using plot
Vectors must be the same lengths.

Error in asas>pushbutton1_Callback (line 83)
plot(axesHandle, x)

Error in gui_mainfcn (line 96)
        feval(varargin{:});
etc...

古いデータを置き換えて、新しいデータ x をプロットしたいと思います。
matlab がプロットするデータを置き換えていないように見えますが、どういうわけかプロットに追加しようとしていますか?

検索しましたが、該当するものは見つかりませんでした。

4

1 に答える 1

8

説明は簡単ではありません。MATLAB とそのハンドル グラフィックス サブシステムを初めて使用する場合は、そうではありません。

あなたのコードをそのまま、行ごとに:

axesHandle= findobj(gcf,'Tag','axes1');
x=rand(randi(10+20,1),4);
plot(axesHandle, x);

最初の行は、プロパティが文字列 に設定されたgcf子オブジェクトを現在の Figure 内で見つけようとします ( , "get current figure") 。あなたはこれを知っていると思いますか?もちろん、2 行目は、プロットするランダム データを生成します。3 行目は のデータをプロットします。'Tag''axes1'x

しかし、plot-call の後、プロパティ'Tag'は実際には''(空の文字列)にリセットされます。これによりfindobj、その後の軸ハンドルの検索が失敗します。したがって、変数axesHandleには実際のハンドルは含まれず、代わりに空の行列が含まれます[]。これにより、プロットのデフォルトが別のモードになり、空の行列が x 軸 ( の最初の引数) のデータとして解釈されますplot。これにより、次のエラーが発生することが予想されます。

...
Error using plot Vectors must be the same lengths.
...

上記のコメントのダンによる解決策は回避策ですが、plot特に GUI では、どこにプロットするかを伝えるのは理にかなっています。

代わりに 4 行目を追加できます。

set(axesHandle,'Tag','axes1');

これにより、プロパティが'Tag'に戻され'axes1'、その後のボタンのクリックも機能するようになります。また、複数の軸オブジェクトを追加できるようになりました。それがあなたのしたいことなら。

于 2012-07-09T17:23:15.977 に答える