0

関数から複数のベクトルを返したい。タプルが機能するかどうかはわかりません。試しましたが、機能していません。

xxx myfunction (vector<vector<float>> matrix1 , vector<vector<float>> matrix2) {

// some functional code: e.g. 
// vector<vector<float>> matrix3 = matrix1 + matrix2;
// vector<vector<float>> matrix4 = matrix1 - matrix2;

return matrix3, matrix4;
4

2 に答える 2

1

これらの行列が非常に小さい場合、このアプローチは問題ないかもしれませんが、一般的にはこの方法は使用しません。まず、サイズに関係なく、const 参照で渡す必要があります。

また、std::vector<std::vector<T>>非常に優れた「マトリックス」実装ではありません。連続したブロックにデータを格納し、ブロック全体で要素単位の操作を実装する方がはるかに優れています。また、(ペアまたは他のクラスを介して)行列を返す場合は、余分なコピーが必要ないため、ムーブ セマンティクスを調べる必要があります。

C++11 を使用していない場合は、行列を参照渡しして関数に入力します。例えば

using Matrix = std::vector<std::vector<float>>; // or preferably something better

void myfunction(const Matrix &m1, const Matrix &m2, Matrix &diff, Matrix &sum)
{
    // sum/diff clear / resize / whatever is appropriate for your use case
    // sum = m1 + m2
    // diff = m1 - m2
}

関数型コードの主な問題std::tuple<Matrix,Matrix>は、コピーを避けることです。余分なコピーを避けるためにここでできる巧妙な方法がありますが、「純粋」ではないスタイルのコーディングを使用する方が簡単な場合もあります。

于 2015-01-07T05:17:06.043 に答える
0

マトリックスの場合、通常、これらのベクトルを持つ構造体またはクラスを作成し、そのクラスのオブジェクトを関数に送信します。そのクラス内にマトリックス関連の操作をカプセル化することも役立ちます。

それでもベクトルのベクトルを使用したい場合は、ここに私の意見があります。参照/ポインターを使用して InOut パラメーターを使用できます。つまり、パラメーターを更新して計算結果を保持できる場合は、引数を送信することになり、その場合は何も返す必要はありません。

パラメーターを const にする必要があり、変更できない場合は、通常、In パラメーターを const 参照として送信し、関数の引数リスト自体で Out パラメーターを分離します。

これが少し役立つことを願っています。

于 2015-01-07T05:24:19.333 に答える