1

関数をコンパイルしてより高速に実行できるように、MATLAB で記述されたコードを C に移植しようとしています (コードは非常に頻繁に実行され、速度が大幅に向上します)。

つまり、基本的に私の MATLAB コードは、行列を取得して文字列に変換し、角かっことコンマを追加して、テキスト ファイルに書き込むことができます。これがベクトル MyVec に対してどのように機能するかについてのアイデアは次のとおりです。

MyVec = rand(1,5);
NbVal = length(MyVec)
VarValueAsText = blanks(2 + NbVal*30 + (NbVal-1));
VarValueAsText([1 end]) = '[]';
VarValueAsText(1 + 31*(1:NbVal-1)) = ',';
for i = 1:NbVal
   VarValueAsText(1+(i-1)*31+(1:30)) = sprintf('%30.15f', MyVec(i));
end

では、C で同様の結果を得るにはどうすればよいでしょうか。文字列 (char 配列) のサイズを事前に計算でき、メモリ領域に書き込む必要がある各要素の位置を知っているので、それほど難しくはないようです。関数もsprintfC に存在します。しかし、これを設定する方法を理解するのに苦労しています。また、試行錯誤で簡単に学習できる環境がないためです (試行ごとに再コンパイルする必要があり、多くの場合、セグメンテーション違反と MATLAB のクラッシュ...)。

問題はおそらく些細に思えるかもしれませんが、誰かが助けてくれることを願っていますが、私はCの経験がほとんどなく、適切な例を見つけることができませんでした...

4

2 に答える 2

5

文字列へのオフセット (バイト単位) を指定すると、このオフセットへのポインターを取得するには、次のようにします。

char *ptr = &string[offset];

マトリックスの行を反復して印刷する場合、ループは次のようになります。

char *ptr = output_buffer;
for (i = 0; i < n_lines; i++) {
    sprintf (ptr, "...", ...);
    ptr = &ptr[line_length];
}

ただし、出力バッファに十分なメモリを割り当てていることを確認してください。

于 2012-09-03T22:38:12.550 に答える
4

sprintf印刷する文字列の最後に文字列ターミネータを配置することを忘れないでください。そのため、「印刷」する文字列が印刷する文字列よりも長くなければならない場合、それは機能しません。

したがって、文字列の一部を上書きしたいだけの場合は、おそらくsprintf一時バッファを使用memcpyしてから、そのバッファを実際の文字列にコピーするために使用する必要があります。このようなもの:

char temp[32];
sprintf(temp, "...", ...);

memcpy(&destination[position], temp, strlen(temp));
于 2012-09-04T06:43:28.887 に答える