我正在努力让我的方法发挥作用。我是C ++的初学者。我试图找到两个向量的点积。我在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;
}
答案 0 :(得分:2)
我想你只想要一个循环:
for(unsigned i = 0; i < vec1.ncols(); ++i){
ret += vec1[i] * vec2[i];
}
我还注意到你比较
vec1.nrows() != vec2.nrows()
但你在循环中使用ncols()
。你想要哪一个?
答案 1 :(得分:0)
我从你的另一个问题中看到你写了一个光线追踪器。
在光线跟踪器中,通常情况下,你总是为矢量和矩阵提供单独的数据结构,因为它们几乎总是以不同的方式使用,编程中的专业化几乎总能带来更快的代码。
如果您然后仅为矢量定义点积,则点积代码将变得简单。