2012-04-10 10 views
-2

私のメソッドを動作させるのに苦労しています。私はC++の初心者です。私は2つのベクトルの内積を見つけようとしています。私はforループでいくつかのエラーが発生しています。誰かが私を助けてくれますか?C++でのドットプロダクト実装

float dot(Matrixf const& vec1, Matrixf const& vec2) { 

    // error check 
    if (!vec1.isVector() || !vec2.isVector()) { 
     throw std::runtime_error("Unable to do dot product: not column vectors."); 
    } 
    if (vec1.nrows() != vec2.nrows()) { 
     throw std::runtime_error("Unable to do dot product: vector lengths not equal."); 
    } 

    /** implementing dot product *************************************/ 

    float ret = 0; 

    for(unsigned i = 0; i < vec1.ncols(); ++i){ 
     for(unsigned j =0; j< vec2.nrows(); ++j){ 
     ret += vec1[i] * vec2[j]; 

} 
    } 
    return ret; 
} 

Matrixfクラス

#include "matrixf.h" 

#include <iostream> 

Matrixf::Matrixf(unsigned int rows, unsigned int cols) { 
    rows_ = rows; 
    cols_ = cols; 
    data_ = new float[rows_ * cols_]; 

    // set all initial values to zero 
    for (unsigned int r = 0; r < rows_; ++r) { 
     for (unsigned int c = 0; c < cols_; ++c) { 
      data_[r * cols_ + c] = 0; 
     } 
    } 
} 

Matrixf::~Matrixf() { 
    delete data_; 
} 

Matrixf::Matrixf(Matrixf const& other) { 
    rows_ = other.rows_; 
    cols_ = other.cols_; 
    data_ = new float[rows_ * cols_]; 
    for (unsigned int i = 0; i < rows_ * cols_; ++i) { 
     data_[i] = other.data_[i]; 
    } 
} 

Matrixf& Matrixf::operator=(Matrixf const& other) { 
    // handles self assignment 
    if (this == &other) { 
     return *this; 
    } 

    delete data_; 
    rows_ = other.rows_; 
    cols_ = other.cols_; 
    data_ = new float[rows_ * cols_]; 
    for (unsigned int i = 0; i < rows_ * cols_; ++i) { 
     data_[i] = other.data_[i]; 
    } 
    return *this; 
} 

float Matrixf::get(unsigned int row, unsigned int col) const { 
#ifndef NDEBUG 
    if (row >= rows_ || col >= cols_) { 
     throw std::runtime_error("Matrix index out of bounds."); 
    } 
#endif 

    return data_[row * cols_ + col]; 
} 

void Matrixf::set(unsigned int row, unsigned int col, float val) { 
#ifndef NDEBUG 
    if (row >= rows_ || col >= cols_) { 
     throw std::runtime_error("Matrix index out of bounds."); 
    } 
#endif 
    data_[row * cols_ + col] = val; 
} 

float& Matrixf::operator()(unsigned int row, unsigned int col) { 
    return data_[row * cols_ + col]; 
} 

float Matrixf::operator()(unsigned int row, unsigned int col) const { 
    return data_[row * cols_ + col]; 
} 

unsigned int Matrixf::nrows() const { 
    return rows_; 
} 

unsigned int Matrixf::ncols() const { 
    return cols_; 
} 

bool Matrixf::isVector() const { 
    return (cols_ == 1); 
} 

Matrixf Matrixf::eye(unsigned int size) { 
    Matrixf e(size, size); 
    for (unsigned int i = 0; i < size; ++i) { 
     e.set(i, i, 1); 
    } 

    return e; 
} 

std::ostream& operator << (std::ostream& os, Matrixf const& matrix) { 
    for (unsigned int r = 0; r < matrix.nrows(); ++r) { 
     for (unsigned int c = 0; c < matrix.ncols(); ++c) { 
      os << matrix.data_[r * matrix.cols_ + c] << " "; 
     } 
     os << "\n"; 
    } 

    return os; 
} 

答えて

2

私はあなただけで一つのループをしたいと思う:

for(unsigned i = 0; i < vec1.ncols(); ++i){ 
    ret += vec1[i] * vec2[i]; 
} 

私はまた、あなたが比較することを気づく

vec1.nrows() != vec2.nrows() 

ですが、ループ内でncols()を使用しています。あなたはどれが欲しいですか?

+0

エラーが発生しました:vec1 [i]でエラーが発生しました。「エラー:オペランドにはこれらのオペランドは一致しません」 – Ice

+0

どちらでも問題ありません。 – Ice

+0

クラス 'Matrixf '? – chrisaycock

0

他の質問から、レイ・トレーサを書いていることが分かります。

レイ・トレーサでは、ほとんど常に異なる方法で使用され、プログラミングの専門分野がほとんど常により高速なコードにつながるため、ベクトルと行列のデータ構造が共通しています。

ドットプロダクトをベクトルのみに定義すると、ドットプロダクトコードは単純になります。