現在、倍精度を使用している動作するMatlab Cコード(mexファイル)があります。したがって、私は、変数のデータ型はfloat
によってdouble
、float *datOut = (float*)mxGetData(mxOut);
によってmxCreateNumericArray()
Double-Single単精度ではなくMatlab mex-Algorithmを実行します
と
によって
mxCreateDoubleMatrix
を
double *datOut = mxGetPr(mxOut)
を置き換えます。使用されている唯一の他のmex-FunctionはmxDuplicateArray()
ですが、他には何もありません。私はこの呼び出しに何も変更しませんでした...今は決して終了しないコードの実行があります。私はそれが誰かが私を助けることができることを十分に短く願っていますように、私はかなりそれをストリップダウン:
float myFunc(const mxArray *point, int index)
{
float *dat = (float*)mxGetData(point);
return dat[index]*dat[index]*dat[index];
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
float h, f0, df1, df2, diff;
// Input Vars #1
float diff = (float)mxGetScalar(prhs[1]);
float H = (float)mxGetScalar(prhs[2]);
int index1 = (int)mxGetScalar(prhs[3]);
int index2 = (int)mxGetScalar(prhs[4]);
// Input Vars #2 -> Duplicate it
mxArray *newPnt = mxDuplicateArray(prhs[0]);
float *newPntDat = (float*)mxGetData(newPnt);
// ...
// PERHAPS SOME UNIMPORANT CODE HERE ...
// ...
h = H;
f0 = myFunc(prhs[0], index1);
newPntData[ index2 ] += h;
df1 = (myFunc(newPnt, index1)-f0)/h;
while(true)
{
h /= 2;
newPntDat[ index2 ] -= h;
df2 = (myFunc(newPnt, index1)-f0)/h;
// If precision is okay
if(abs(df2-df1) <= diff)
break;
// Save for next loop iteration
df1 = df2;
}
// Return df2-Value to Matlab
}
は何とかそれは無限ループだと私はdiff
を介して定義される精度はのために簡単にアクセスする必要がありますなぜので、知りません与えられた関数myFunc()
。両方の関数double *datOut = mxGetPr(mxOut)
とmxCreateDoubleMatrix
で倍精度を使用すると、identicallコードはうまく動作します。私はまた、明示的にポイントをpoint = zeros(rows, 1, 'single');
で渡すことによってmex-Functionを呼び出そうとしました。
私は正しい方向に向いているか、それについて私に何か示唆を与えてくれてありがとう。ありがとう!
ありがとう、本当に本当に私を助けることができました。私は後で試してみて、それがうまくいくかどうか教えてくれるでしょう – tim
ああ、ちょうど質問です: 'mxArray * newPnt = mxDuplicateArray(prhs [0]);'は何ですか? 'myMexFunc(ones(1000、1)) 'を介してmex-Functionを呼び出すときに' float * newPntDat =(float *)mxGetData(newPnt); 'を使用している場合でもこれは動作しますか? ()に? – tim
"single"パラメータを使用する必要があります。さもなければ、mexに渡された配列はデフォルトで2倍になり、浮動小数点にキャストすることはできません(mxDuplicateArrayはどちらの方法でも動作します - 結果は入力と同じ型で、単精度配列を渡した場合のみ単一配列になります) – nimrodm