Я новичок в С++. Я хочу создать матрицу 3x3, которая выглядит так:
Я хочу, чтобы тета была параметром, который я могу определить вне матрицы и подключить его при умножении матриц. Как мне это сделать?
Если бы это был python, я бы хотел что-то вроде этого:
define matrix(theta):
row1 = np.array([cos(theta), -sin(theta), 0])
row2 = np.array([sin(theta), cos(theta), 0])
row3 = np.array([0,0,1])
matrix = np.stack([row1, row2, row3])
return matrix
In[] matrix(2)
Out[]
[[cos(2), -sin(2), 0],
[sin(2), cos(2), 0],
[0, 0, 1]]
Обратите внимание, что это похоже на матрицу вращения, а не на матрицу перевода :)
Что-то вроде этого:
class RotationMatrix
{
public:
RotationMatrix(const double radians)
: m({{cos(radians, -sin(radians), 0}, {sin(radians), cos(radians), 0}, {0, 0, 1}}) {}
private:
std::array<std::array<double, 3>, 3> m;
};
Вам не обязательно определять выделенный класс, если вы хотите сделать что-то быстрое и грязное:
#include <iostream>
#include <cmath>
#include <array>
using Mat3x3 = std::array<std::array<double, 3>, 3>;
auto rotationMatrix(double theta)
{
Mat3x3 mat
{ std::array{ cos(theta), -sin(theta), 0. },
std::array{ sin(theta), cos(theta), 0. },
std::array{ 0., 0., 1. } };
return mat;
}
int main()
{
auto mat = rotationMatrix(0.1);
for (const auto& row : mat)
{
for (const auto& col : row)
std::cout << col << " ";
std::cout << "\n";
}
}
/* prints:
0.995004 -0.0998334 0
0.0998334 0.995004 0
0 0 1
*/
-- РЕДАКТИРОВАТЬ --
Вот версия С++ 11 по многочисленным просьбам. Скомпилировано с помощью "g++ mat3.cc --std=c++11"
#include <iostream>
#include <cmath>
#include <array>
using Mat3x3 = std::array<std::array<double, 3>, 3>;
Mat3x3 translationMatrix(double theta)
{
Mat3x3 mat
{ std::array<double, 3> { cos(theta), -sin(theta), 0. },
std::array<double, 3> { sin(theta), cos(theta), 0. },
std::array<double, 3> { 0., 0., 1. } };
return mat;
}
int main()
{
Mat3x3 mat = translationMatrix(0.1);
for (const auto& row : mat)
{
for (const auto& col : row)
std::cout << col << " ";
std::cout << "\n";
}
}
Вы также можете использовать «Матрицу вращения Mat3x3 (двойная тета)».
Я думаю, что это было бы лучшим решением:
#include <array>
#include <math.h>
#include <iostream>
typedef std::array<std::array<int,3>,3> Matrix3X3;
Matrix3X3 getMatrix(int x) {
Matrix3X3 matrix;
matrix[0][0] = //sin of x;
//...and so on
return matrix;
}
int main() {
Matrix3X3 matrix = getMatrix(3);
return 0;
}
Эээ... std::array<std::array<int,3>,3>?