問題タブ [matlab-class]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
matlab - プロパティはオブジェクト指向 MATLAB でどのように機能しますか?
メソッド呼び出しの結果として更新されるメンバー変数を使用して MATLAB クラスを作成しようとしていますが、クラス内のプロパティを変更しようとすると (MATLAB のメモリ管理から理解したように) コピーが作成されます。元のオブジェクトのプロパティはそのままにして、オブジェクトを変更します。
.
matlab - Matlab オブジェクトのプロパティを変更する方法
次のような MATLAB クラスを作成しました。
x_array
問題は、関数を呼び出したときにプロパティが変更されないことincrement()
です: ex:
私はいくつかの調査を行い、これはMATLABがオブジェクトにLazy Copyを使用しているためであるという結論に達しました.クラスをHANDLEクラスに継承させることでこれを解決する必要がありましたが、そうではありませんでした。そして、ハンドルクラスを拡張することが解決策である場合、これは正しい方法ではありません:
または追加の手順はありますか?
matlab - MATLAB (R2008a) オブジェクトのクラスが保存/読み込みサイクルで変わるのはなぜですか?
更新: これは既知のバグです。リンクにアクセスするには、Mathworks にログインする必要があります。
バグ報告のまとめ
バージョン 7.6 (R2008a) を使用して MAT ファイルに保存された MATLAB ユーザー定義クラスのインスタンスは、そのプロパティ値の 1 つが別の MATLAB クラスのインスタンスである場合、正しく読み込まれない可能性があります。
簡単に言うと、Mathworks は、以前に保存された最上位のカスタム オブジェクトが正しく読み込まれていない可能性があり (後述)、SAVE ステップでエラーが発生したことを報告しています。そのため、データは MAT ファイル内で破損しています。
私の経験から、これは断続的なようです。あるデータ解析アプリケーションで、75 個の MAT ファイルのうち 37 個がこの破損で保存されました:(
ユーザー定義オブジェクトには注意してください。データが破損していないことを確認するために、保存時に次のテストを追加しました
元の質問
ここでは MATLAB 2008a を使用しています。この微妙なバグは MATLAB-2009a で修正されています。とにかく、私の 2 つのクラスが定義されている方法では、セーブ/ロード サイクルにより、1 つのクラス (superClass) の変数が 2 番目のクラス (propClass) の変数としてロードされます。
MATLAB (r2008a) セッションの例
matlab.mat を読み込んだ後、変数bbが不可解に superClass から propClass に変更されました
クラス: スーパークラス
このクラスには propClass 型の配列を含める必要があり、これが Naive 定義です。
クラス: propClass
PropClass は、スーパー クラスによって使用される 2 番目のクラスです。その定義は、このバグにとって重要ではありません。
質問
では、MATLAB-R2008a でロード操作の後に superClass が propClass に変更されるのはなぜですか? 次に、この症状を回避するためにsuperClassの定義を変更するにはどうすればよいですか?
ノート
私が書いたより大きなクラスでこの症状に遭遇し、問題の原因を絞り込みました。上記の MATLAB セッションで発生することはわかっていますが、スーパークラスのプロパティ配列にオブジェクトを追加すると、問題が解消されるようです。したがって、保存する前に superClass.addProp を呼び出すと、superClass から propClass への奇妙な変更は発生しません。
matlab - MATLAB で列挙型を作成するにはどうすればよいですか?
MATLAB に列挙型はありますか? そうでない場合、代替手段は何ですか?
matlab - Matlab ポリモーフィズム
2 つの新しいスタイルの MATLAB クラスB
&C
があります。どちらも抽象的な親の具体的なサブクラスですA
。 (ハンドル クラス)A
のサブクラスです。それらをMATLABの配列に入れ、両方をshgsetset
として扱いたいと思います。A
それらは、大まかに次のように定義されます。
ただし、これを行うと:
MATLAB は、両方とも型が であると教えてくれます。その両方の implement( )B
から抽象メソッドを呼び出すと、基本的に の 2 つのコピーが実行されます。 A
foo
b
ただし、順序を逆にすると:
どちらもタイプC
であることがわかり、両方で foo を実行しようとすると、基本的に の 2 つのコピーが実行されc
ます。
ポリモーフィックな方法でサブクラスを使用する方法はありますか?
それらをセル配列に入れれば、必要なものの 90% を取得できることがわかっています。しかし、それはちょっとしたコツです。
matlab - MATLAB OOP は遅いですか、それとも何か間違っていますか?
私はMATLAB OOPを試しています。最初は C++ の Logger クラスを模倣し、すべての文字列ヘルパー関数を String クラスにa + b
入れてa == b
いa.find( b )
ます。などの最初の要素を取得します。strcat( a b )
strcmp( a, b )
strfind( a, b )
問題: スローダウン
上記のものを使用すると、すぐに劇的な速度低下に気付きました. 私はそれを間違っていますか (MATLAB の経験がかなり限られているため、これは確かに可能です)、または MATLAB の OOP が多くのオーバーヘッドを導入しているだけですか?
私のテストケース
文字列に対して行った簡単なテストは次のとおりです。基本的には、文字列を追加し、追加された部分を再度削除するだけです。
注: 実際のコードで、このような String クラスを実際に記述しないでください。現在、 Matlab にはネイティブの
string
配列型があり、代わりにそれを使用する必要があります。
結果
1000回の反復の合計時間(秒):
btest 0.550 (String.SetLength 0.138、String.plus 0.065、String.Length 0.057 の場合)
テスト 0.015
ロガー システムの結果も同様に: への 1000 回の呼び出しで 0.1 秒、システムへの 1000 回の呼び出しfrpintf( 1, 'test\n' )
で 7 (!) 秒 (String クラスを内部で使用する場合) (OK、それにはもっと多くのロジックが含まれていますが、C++ と比較すると:出力側std::string( "blah" )
とstd::cout
プレーンを使用するシステムのオーバーヘッドはstd::cout << "blah"
1 ミリ秒程度です。)
クラス/パッケージ関数を検索するときのオーバーヘッドですか?
MATLAB は解釈されるため、実行時に関数/オブジェクトの定義を検索する必要があります。そのため、クラスまたはパッケージ関数とパスにある関数の検索には、おそらくはるかに多くのオーバーヘッドが関係しているのではないかと考えていました。これをテストしようとしましたが、奇妙になります。クラス/オブジェクトの影響を排除するために、パス内の関数の呼び出しとパッケージ内の関数の呼び出しを比較しました。
上記と同じ方法で収集された結果:
atest 0.004 秒、ctest で 0.001 秒
btest 0.060 秒、util.ctest で 0.014 秒
では、このオーバーヘッドはすべて、MATLAB が OOP 実装の定義を検索するのに時間を費やすことによるものであり、このオーバーヘッドは直接パスにある関数には存在しないのでしょうか?
matlab - MATLAB の定数
私は一連の MATLAB コードを所有するようになり、コードに散在する一連の「マジック ナンバー」に気付きました。通常、私はこれらの定数を C、Ruby、PHP などの言語で作成するのが好きです。この問題をグーグルで検索すると、定数を持つ「公式の」方法は、定数値を返す関数を定義することであることがわかりました。特に、ファイルごとに複数の関数を許可する場合、MATLAB は扱いにくい場合があるため、面倒に思えます。
これは本当に最良の選択肢ですか?
私はこれを行うためにCプリプロセッサのようなものを使用/作成したいと思っています。(同じような苦境にある誰かが作ったものを見つけましたmpp
が、放棄されたようです。コードはコンパイルされず、私のニーズを満たすかどうかわかりません。)
matlab - matlab でハンドル オブジェクトが使用するメモリ量を確認するにはどうすればよいですか
オブジェクトを handle classdef obj < handle のサブクラスとして宣言すると、オブジェクトは本質的にどこかのメモリへの「ポインタ」になります。オブジェクトが使用しているメモリの量を確認するにはどうすればよいですか?
たとえば、フィールドバーを持つクラス foo があるとします
bar は 8 メガバイトを占めます (8 バイト * 100 万の数字)
しかし、私がタイプすると
私は得る
obj が指しているメモリの合計量を調べるにはどうすればよいですか?
matlab - MATLAB クラスを編成する最良の方法は?
MATLAB には、クラスを編成する 2 つの方法があります。
@-ディレクトリ:
単一ファイル:
最初のスタイルは新しいclassdef
構文の前に存在していましたが、より構造化された方法のようです。2 番目のスタイル (単一のファイル内のすべて) は新しいものです。
どの方法を使用しますか。また、その理由は何ですか?
matlab - 別の.mファイルでclassdefのプロパティを使用しますか?
これが私のコードです:
fm:
test.m:
コマンドウィンドウでtestと入力すると、次のように表示されます。