私は4つの異なるサブアレイに分割しなければならない1次元のフロートアレイを私に送るセンサを持っています。私の配列はフレームを表し、それは1024ランプで構成されています。各ランプには4つのチャンネル(分割したいデータ)のヘッダとデータがあります。各チャンネルには2つの浮動小数点数があり、1つは実部用、もう1つは複雑部用です。これを明確にするために、私は構造の画像を添付した:私はデータと4列、単一チャネルのための各一つにこの大きな配列を解明する必要がねじれたアレイで構成されたアレイを分割する
。これは速く行わなければなりません。私の実装には約850msかかりますが、残念ながらこれは十分に速くはありません。これまでのところ私は次のコードを書いています:
IntPtr ptr = (IntPtr)frameInfo.ptr; // The pointer to the buffer
for (int i = 0; i < nChannels; i++)
{
channelFrames[i].data = new float[nRamps * nPoints * 2];
}
for (int ramp = 0; ramp < nRamps; ramp++)
{
ptr += (int)rawHeaderSize; // Skip the header
for (int point = 0; point < nPoints; point++)
{
for (int channel = 0; channel < nChannels; channel++)
{
Marshal.Copy(ptr, channelFrames[channel].data, (int)(point *2 + ramp*nPoints*2), 2);
ptr += (sizeof(float) * 2); // Move to the next data
}
}
}
これをもっと速くする方法はありますか?
たぶん、あなたは試してみてください[コードレビュー](https://codereview.stackexchange.com/) –
あなたの図は、あなたの説明やコードが一致していないようですか? 「各チャンネルには2つの浮動小数点数がありますが、ダイアグラムにはチャネルごとに8つの浮動小数点が表示さ何がポイントで、nPointsとは何ですか?そして、なぜあなたは一度に2つのフロートをコピーしていますか(それはあなたのダイアグラムに従ってre0 + re1、re2 + re3になります)?あなたが 'new float []'を代入しているので、 'data'は' float''Array'であると仮定します。 – NetMage
@NetMageいいえ、チャンネルごとに2つのフロートを表示します。各フロートは4バイトなので、Re0Re1Re2Re3はフロートを作成し、Im0Im1Im2Im3は別のフロートを作成します。 nPointsは4096です.Marshal.Copyはすでに4バイトをfloatに変更します。浮動小数点数、実数部、虚数部の両方をチャンネル配列にコピーする必要があります。 – Ignacio