2016-06-26 4 views
2

、固定サイズの配列は、我々はゼロ(42,42)、もの(42,42)、INF(42,42)、ナン(42,42)...は、W/O初期化

を持って、私たちを作成できます

初期化なしの配列を作成し、後でそれを記入できますか?コードアナライザがその安全性を証明することはできません。しかし、配列が大きい場合、これは計算を節約することができます。

+2

このような場合のユースケースは何ですか?とにかく後で値を割り当てるつもりなら、これらのいずれかが行いますが、そうではありませんか? – beaker

+0

@beaker、行列が大きいときは、完全にそれらを埋めるでしょう。それを初期化なしで作成すると、少し時間を節約できます。これは私たちがCで行ったようなものです。 –

答えて

3

固定サイズの空の配列などはありません。後で配列の要素を塗りつぶして、要素[k1, k2]に値を代入すると、の配列のサイズは、少なくとも[k1, k2]以上(すべてデフォルト)になります。その理由は、matlabの配列は同種のコンテナなので、すべての要素は適切なdouble(または対応する型の配列)でなければなりません。遅かれ早かれ、割り当てられていない要素の場合には配列を0にする必要があります。完全な行列の場合に行う最も効率的なことは、に事前に割り当て、です。これはzeros(k1max,k2max)です。実際には、少なくとも旧バージョンのMATLABでは、配列の右下隅に1つのゼロを代入することにより、mymat(k1max,k2max)=0;で事前割り振りを行う方が高速です(これにより、それと[1,1]の間の他の要素はすべて自動的に事前に割り当てられます)。事前割り当てのもう1つのメリットは、MATLABがアレイ全体に一度に連続したメモリブロックを予約できることです。

あなたが探しているのは、スパースアレイです。膨大な数のゼロ要素を持つ大規模な配列の場合、これらのゼロをすべてメモリに格納し、それらの計算を実行するのは非効率的ですMATLABはsparse配列を自然に扱います(0以外の要素のみが格納されます) )、リード非常に疎な行列の場合(非ゼロ要素の数が要素の総数よりもはるかに少ない)、メモリの効率とパフォーマンスが大幅に向上します。

スパース行列の重要な欠点は、すべての算術演算とほとんどすべての行列演算がそれらのために実装されていることです。あるいは、少なくとも自動的にフル行列にキャストされます。これにより、完全な行列とほとんど同じになります。あなたの質問に沿って、ゼロ以外の要素だけを保存します。明らかに、これは行列が十分に疎である場合にのみ効率的であり、そうでなければ、要素の簿記からのオーバーヘッド(完全にベクトル化された行列演算を使用しない)は、その使用を非効率的にする。最終的発言として

、私はちょうどあなた限り、その寸法の一つがゼロであるとして空の二重配列を作成することに注意したい:

>> double.empty(100,0) 

ans = 

    Empty matrix: 100-by-0 

>> double.empty(100,100) 
Error using double.empty 
At least one dimension must be zero. 

が、これはほとんど実用的なアプリケーションでの場所を持っていません。

+0

ありがとう!私もhttp://www.mathworks.com/help/search.html?qdoc=mxcreateuninitnumericmatrixでmexを作ってからmatlabから呼び出すことができました。これはmymat(k1max、k2max)= 0;より良いでしょうか? –

+0

@JoeC MEXには豊富な経験はありません。しかし、私はこれを知っています。配列全体を埋める必要がある場合は、すべての要素を遅かれ早かれ割り当てることを避けることはできません。後で行うと時間がかかり、効率が悪くなります。私は 'mymat(k1max、k2max)= 0;'が最善の機会だと考えています。実際の問題は、割り当てがアプリケーションのどのようなボトルネックだと思いますか?適切な事前配分をして、そのようなことを聞​​いたことはありません。 –

+0

@JoeCああ、どこから来ているのか分かりました。あなたは 'malloc'のようなものを意味しますが、matlabでの事前割り振りは' calloc'と同じですか?私はMEXだけでそれができると確信しています。あなたがリンクしているものは良い候補かもしれません。あなたはそれがうまくいくかどうかを試してみるべきです(「作品」とは、MATLAB側で返された行列が何であるかを見て、それがゴミであれば本当に役に立ちます)。私の疑問は、これが測定可能なパフォーマンス低下の原因になると思われるかどうかは変わりません。 –