-3

私は自分の方法を機能させるのに苦労しています。私はC++の初心者です。2 つのベクトルの内積を見つけようとしています。forループでいくつかのエラーが発生しています。どうすれば修正できますか?

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;
}
4

2 に答える 2

2

私はあなたがただ1つのループが欲しいと思います:

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

私はあなたが比較することにも気づきます

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

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

于 2012-04-10T00:47:54.700 に答える
0

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

レイ トレーサーでは、ベクトルと行列のデータ構造を別々にするのが一般的であり、ほぼ常にそうです。これは、ほとんどの場合、それらが異なる方法で使用され、プログラミングの特殊化により、ほとんどの場合、コードが高速になるためです。

次に、ベクトルのみに対して内積を定義すると、内積コードは単純になります。

于 2012-04-25T06:00:36.500 に答える