5

私はいくつかの mex 関数を書き、文字列の巨大な配列を返さなければなりません。

私は次のようにこれを行います:

  mxArray * array = mxCreateCellMatrix(ARRAY_LEN, 1);
  for (size_t k = 0; k < ARRAY_LEN; ++ k) {
      mxArray *str = mxCreateString("Hello");
      mxSetCell(array, k, str);
  }
  prhs[0] = array;

ただし、文字列は常に同じ値であるため、インスタンスを 1 つだけ作成したいと考えています。お気に入り

  mxArray * array = mxCreateCellMatrix(ARRAY_LEN, 1);
  mxArray *str = mxCreateString("Hello");

  for (size_t k = 0; k < ARRAY_LEN; ++ k) {
      mxSetCell(array, k, str);
  }
  prhs[0] = array;

可能ですか?ガベージコレクターはそれを解放することをどのように知っていますか? ありがとうございました。

4

4 に答える 4

3

悪いニュース... R2014a (おそらく R2013b ですが確認できません) の時点で、mxCreateReference はライブラリで使用できなくなったため (欠落しているか、エクスポートされていません)、リンクは失敗します。以下は、mxArray をハックして参照カウントを手動で増加させるために使用できる代替関数です。

struct mxArray_Tag_Partial {
    void *name_or_CrossLinkReverse;
    mxClassID ClassID;
    int VariableType;
    mxArray *CrossLink;
    size_t ndim;
    unsigned int RefCount; /* Number of sub-elements identical to this one */
};

mxArray *mxCreateReference(const mxArray *mx)
{
    struct mxArray_Tag_Partial *my = (struct mxArray_Tag_Partial *) mx;
    ++my->RefCount;
    return (mxArray *) mx;
}
于 2015-03-11T02:58:56.100 に答える