Как построить матрицу перевода 3x3 в С++

Я новичок в С++. Я хочу создать матрицу 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]]
 


Эээ... std::array<std::array<int,3>,3>?

kesarling He-Him 18.12.2020 16:37

Обратите внимание, что это похоже на матрицу вращения, а не на матрицу перевода :)

Damien 18.12.2020 16:40
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
545
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Что-то вроде этого:

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 (двойная тета)».

Keijo 18.12.2020 17:05

Я думаю, что это было бы лучшим решением:


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

Другие вопросы по теме