{"id":906,"date":"2025-07-08T13:31:34","date_gmt":"2025-07-08T12:31:34","guid":{"rendered":"https:\/\/blog.syddel.uk\/?p=906"},"modified":"2025-07-08T14:22:58","modified_gmt":"2025-07-08T13:22:58","slug":"simple-c-matrix-class","status":"publish","type":"post","link":"https:\/\/blog.syddel.uk\/?p=906","title":{"rendered":"Simple C++ Matrix Class"},"content":{"rendered":"\n<p>Matrices are a fundamental building block in many computational applications, particularly in the realm of scientific computing (e.g. CFD &#8211; Computational Fluid Dynamics) and machine learning. The architecture of a matrix class must be carefully crafted to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Efficiently perform matrix functions.<\/li>\n\n\n\n<li>Scale without needing to significantly refactor or redesign algorithms.<\/li>\n<\/ul>\n\n\n\n<p>In this post we&#8217;re going to create a matrix class that can perform:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Matrix_multiplication\" data-type=\"link\" data-id=\"https:\/\/www.mathsisfun.com\/algebra\/matrix-multiplying.html\">Matrix multiplication.<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Matrix_addition\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Matrix_addition\">Matrix addition.<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Transpose\" data-type=\"link\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Transpose\">Matrix transposition.<\/a><\/li>\n<\/ul>\n\n\n\n<p>In later posts, we will use this matrix class to create a simple neural network that will learn how to perform the XOR function, and then we&#8217;ll cover how we can use the GPU to perform our matrix operations in parallel.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Data Storage<\/h1>\n\n\n\n<p>So how are we going to represent the actual matrix? For now, we will only be working with <em>M<\/em> x <em>N<\/em> matrices (i.e. a 2 dimensional array), where <em>M<\/em> is the number of rows, and <em>N<\/em> is the number of columns. We could use a raw array, an <code>std::vector<\/code>, or even more complex data types.<\/p>\n\n\n\n<p>A one dimensional array (or vector) is often the most practical data structure to use in a matrix class. If using a one dimensional array to represent a two dimensional matrix, the index can be calculated using:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>index = row * number_of_columns + column<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #ADBAC7\">index <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> row <\/span><span style=\"color: #F47067\">*<\/span><span style=\"color: #ADBAC7\"> number_of_columns <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> column<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>While a raw one dimensional array would be a compact and efficient representation of a matrix, it lacks flexibility, automatic memory management and safety features. Considering this, we&#8217;ll use an <code>std::vector <\/code>for this first example, as it provides a good balance between performance and ease of use. Moreover, when working with OpenCL, we need to allocate memory on the device, and an <code>std::vector<\/code> can easily be converted to raw pointers when needed.<\/p>\n\n\n\n<p>Okay, less yappin&#8217;, more tappin&#8217; (on the keyboard, that is!)&#8230;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Implementation<\/h1>\n\n\n\n<p>For this first attempt, we&#8217;re going to shove everything into a header file (just to keep it simple). In this case, the file will be called <code>matrix.h<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class Matrix\n{\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Let&#8217;s add a <code>vector<\/code> of <code>vector<\/code> of <code>double<\/code> to store our 2D matrix. We&#8217;ll also store the number of rows and columns whenever we instantiate a new <code>Matrix<\/code>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class Matrix\n{\n  private:\n  \n  std::vector&lt;std::vector&lt;double>> data;\n  size_t rows, cols;\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">private:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> rows, cols;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>And now the constructor to initialize the <code>Matrix<\/code> class when passing in a <code>vector<\/code> or <code>vector<\/code> of <code>double<\/code> (2D <code>vector<\/code>):<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class Matrix\n{\n  private:\n  \n  std::vector&lt;std::vector&lt;double>> data;\n  size_t rows, cols;\n\n  public:\n  \n  \/\/ Constructor\n  Matrix(const std::vector&lt;std::vector&lt;double>> &amp;values)\n      : data(values), rows(values.size()), cols(values&#91;0&#93;.size()) {}\n\n  \/\/ Getters\n  size_t getRows() const { return rows; }\n  size_t getCols() const { return cols; }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">private:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> rows, cols;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Constructor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      : <\/span><span style=\"color: #DCDCAA\">data<\/span><span style=\"color: #D4D4D4\">(values), <\/span><span style=\"color: #DCDCAA\">rows<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()), <\/span><span style=\"color: #DCDCAA\">cols<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()) {}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Getters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getRows<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> rows; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getCols<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> cols; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Let&#8217;s now add a couple of methods to output the Matrix:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;iomanip>\n#include &lt;iostream>\n#include &lt;vector>\n\nclass Matrix\n{\n  private:\n  \n  std::vector&lt;std::vector&lt;double>> data;\n  size_t rows, cols;\n\n  public:\n  \n  \/\/ Constructor\n  Matrix(const std::vector&lt;std::vector&lt;double>> &amp;values)\n      : data(values), rows(values.size()), cols(values&#91;0&#93;.size()) {}\n\n  \/\/ Getters\n  size_t getRows() const { return rows; }\n  size_t getCols() const { return cols; }\n\n  \/\/ Print Matrix\n  void print() const {\n    for (const auto &amp;row : data) {\n      for (double val : row)\n        std::cout &lt;&lt; std::fixed &lt;&lt; std::setprecision(4) &lt;&lt; std::setw(10) &lt;&lt; val &lt;&lt; \" \";\n      std::cout &lt;&lt; std::endl;\n    }\n  }\n\n  \/\/ Overload print method to print text above the matrix\n  void print(const std::string &amp;text) const {\n    std::cout &lt;&lt; text &lt;&lt; std::endl;\n    this->print();\n    std::cout &lt;&lt; std::endl;\n  }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iomanip&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;vector&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">private:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> rows, cols;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">public:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Constructor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      : <\/span><span style=\"color: #DCDCAA\">data<\/span><span style=\"color: #D4D4D4\">(values), <\/span><span style=\"color: #DCDCAA\">rows<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()), <\/span><span style=\"color: #DCDCAA\">cols<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()) {}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Getters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getRows<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> rows; }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getCols<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> { <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> cols; }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Print Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> &amp;row : data) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\"> val : row)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::fixed &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">setprecision<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">) &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">setw<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">) &lt;&lt; val &lt;&lt; <\/span><span style=\"color: #CE9178\">&quot; &quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Overload print method to print text above the matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">text<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; text &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Now we&#8217;re ready to implement whatever matrix functions we want\/need in our <code>Matrix<\/code> class.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Addition<\/h2>\n\n\n\n<p>From the above wiki links:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Consider Matrix A and Matrix B:\n\nA =  &#91; 2  3 &#93;\n     &#91; 1  4 &#93;\n\nB =  &#91; 5  2 &#93;\n     &#91; 0  1 &#93;\n     \nTo add these two matrices:\n\nA + B = &#91; (2 + 5)  (3 + 2) &#93;\n        &#91; (1 + 0)  (4 + 1) &#93;\n        \nThe result:\n\nA + B = &#91; 7  5 &#93;\n        &#91; 1  5 &#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Consider Matrix A and Matrix B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A =  &#91; 2  3 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     &#91; 1  4 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">B =  &#91; 5  2 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     &#91; 0  1 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">To add these two matrices:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A + B = &#91; (2 + 5)  (3 + 2) &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &#91; (1 + 0)  (4 + 1) &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">The result:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A + B = &#91; 7  5 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &#91; 1  5 &#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Let&#8217;s implement this in our <code>Matrix<\/code> class by overloading the &#8220;+&#8221; operator:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Matrix Addition\nMatrix operator+(const Matrix &amp;other) const {\n  if (rows != other.rows || cols != other.cols)\n    throw std::invalid_argument(\"Matrix dimensions must match for addition.\");\n\n  std::vector&lt;std::vector&lt;double>> result(rows, std::vector&lt;double>(cols));\n  for (size_t i = 0; i &lt; rows; ++i)\n    for (size_t j = 0; j &lt; cols; ++j)\n      result&#91;i&#93;&#91;j&#93; = data&#91;i&#93;&#91;j&#93; + other.data&#91;i&#93;&#91;j&#93;;\n\n  return Matrix(result);\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Matrix Addition<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">operator+<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (rows != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rows<\/span><span style=\"color: #D4D4D4\"> || cols != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">invalid_argument<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix dimensions must match for addition.&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(rows, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;(cols));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; cols; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; = <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; + <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Multiplication<\/h2>\n\n\n\n<p>Again, from the wiki links above:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Consider Matrix A and Matrix B:\n\nA = &#91; 1   2 &#93;\n    &#91; 3   4 &#93;\n\nB = &#91; 5   6 &#93;\n    &#91; 7   8 &#93;\n    \nA * B = &#91; 1 \u00d7 5 + 2 \u00d7 7, 1 \u00d7 6 + 2 \u00d7 8 &#93;\n        &#91; 3 \u00d7 5 + 4 \u00d7 7, 3 \u00d7 6 + 4 \u00d7 8 &#93;\n\nThe result:\n\nA * B = &#91; 19   22 &#93;\n        &#91; 43   50 &#93;\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Consider Matrix A and Matrix B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A = &#91; 1   2 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &#91; 3   4 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">B = &#91; 5   6 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &#91; 7   8 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A * B = &#91; 1 \u00d7 5 + 2 \u00d7 7, 1 \u00d7 6 + 2 \u00d7 8 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &#91; 3 \u00d7 5 + 4 \u00d7 7, 3 \u00d7 6 + 4 \u00d7 8 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">The result:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A * B = &#91; 19   22 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        &#91; 43   50 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Implementation within out <code>Matrix<\/code> class, this time overloading the &#8220;*&#8221; operator:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Matrix Multiplication\nMatrix operator*(const Matrix &amp;other) const {\n  if (cols != other.rows)\n    throw std::invalid_argument(\"Invalid dimensions for matrix multiplication.\");\n\n  std::vector&lt;std::vector&lt;double>> result(rows, std::vector&lt;double>(other.cols, 0));\n  for (size_t i = 0; i &lt; rows; ++i)\n    for (size_t j = 0; j &lt; other.cols; ++j)\n      for (size_t k = 0; k &lt; cols; ++k)\n        result&#91;i&#93;&#91;j&#93; += data&#91;i&#93;&#91;k&#93; * other.data&#91;k&#93;&#91;j&#93;;\n\n  return Matrix(result);\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Matrix Multiplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">operator*<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (cols != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rows<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">invalid_argument<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Invalid dimensions for matrix multiplication.&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(rows, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;(<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> k = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; k &lt; cols; ++k)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; += <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;k&#93; * <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;k&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Transposition<\/h2>\n\n\n\n<p>Finally, let&#8217;s &#8220;transpose&#8221; a matrix:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>Consider a single matrix:\n\nA = &#91; 1  2  3 &#93;\n    &#91; 4  5  6 &#93;\n\nTranspose A:\n\nA\u1d57 = &#91; 1  4 &#93;\n     &#91; 2  5 &#93;\n     &#91; 3  6 &#93;\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">Consider a single matrix:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A = &#91; 1  2  3 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    &#91; 4  5  6 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Transpose A:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">A\u1d57 = &#91; 1  4 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     &#91; 2  5 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     &#91; 3  6 &#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Pretty straight forward:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Matrix Transpose\nMatrix transpose() const {\n  std::vector&lt;std::vector&lt;double>> result(cols, std::vector&lt;double>(rows));\n  for (size_t i = 0; i &lt; rows; ++i)\n    for (size_t j = 0; j &lt; cols; ++j)\n      result&#91;j&#93;&#91;i&#93; = data&#91;i&#93;&#91;j&#93;;\n\n  return Matrix(result);\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\">\/\/ Matrix Transpose<\/span><\/span>\n<span class=\"line\"><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">transpose<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(cols, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt;(rows));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; cols; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;j&#93;&#91;i&#93; = <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>One more thing to do &#8211; let&#8217;s turn this (now complete) example into a template class. The complete listing of what we now have (converted to a template class):<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include &lt;iomanip>\n#include &lt;iostream>\n#include &lt;vector>\n\ntemplate &lt;typename T>\nclass Matrix\n{\n  private:\n\n  std::vector&lt;std::vector&lt;T>> data;\n  size_t rows, cols;\n\n  public:\n\n  \/\/ Constructor\n  Matrix(const std::vector&lt;std::vector&lt;T>> &amp;values)\n      : data(values), rows(values.size()), cols(values&#91;0&#93;.size()) {\n  }\n\n  \/\/ Getters\n  size_t getRows() const {\n    return rows;\n  }\n  size_t getCols() const {\n    return cols;\n  }\n\n  \/\/ Print Matrix\n  void print() const {\n    for (const auto &amp;row : data) {\n      for (T val : row)\n        std::cout &lt;&lt; std::fixed &lt;&lt; std::setprecision(4) &lt;&lt; std::setw(10) &lt;&lt; val &lt;&lt; \" \";\n      std::cout &lt;&lt; std::endl;\n    }\n  }\n\n  \/\/ Overload print method so text can also be printed before the Matrix is printed\n  void print(const std::string &amp;text) const {\n    std::cout &lt;&lt; text &lt;&lt; std::endl;\n    this->print();\n    std::cout &lt;&lt; std::endl;\n  }\n\n  \/\/ ---------- The Matrix operations ---------------------------------------------------------\n\n  \/\/ Matrix Addition\n  Matrix operator+(const Matrix &amp;other) const {\n    if (rows != other.rows || cols != other.cols)\n      throw std::invalid_argument(\"Matrix dimensions must match for addition.\");\n\n    std::vector&lt;std::vector&lt;T>> result(rows, std::vector&lt;T>(cols));\n    for (size_t i = 0; i &lt; rows; ++i)\n      for (size_t j = 0; j &lt; cols; ++j)\n        result&#91;i&#93;&#91;j&#93; = data&#91;i&#93;&#91;j&#93; + other.data&#91;i&#93;&#91;j&#93;;\n\n    return Matrix(result);\n  }\n\n  \/\/ Matrix Multiplication\n  Matrix operator*(const Matrix &amp;other) const {\n    if (cols != other.rows)\n      throw std::invalid_argument(\"Invalid dimensions for matrix multiplication.\");\n\n    std::vector&lt;std::vector&lt;T>> result(rows, std::vector&lt;T>(other.cols, 0));\n\n    for (size_t i = 0; i &lt; rows; ++i)\n      for (size_t j = 0; j &lt; other.cols; ++j)\n        for (size_t k = 0; k &lt; cols; ++k) {\n          result&#91;i&#93;&#91;j&#93; += data&#91;i&#93;&#91;k&#93; * other.data&#91;k&#93;&#91;j&#93;;\n        }\n\n    return Matrix(result);\n  }\n\n  \/\/ Transpose\n  Matrix transpose() const {\n    std::vector&lt;std::vector&lt;T>> result(cols, std::vector&lt;T>(rows));\n    for (size_t i = 0; i &lt; rows; ++i)\n      for (size_t j = 0; j &lt; cols; ++j)\n        result&#91;j&#93;&#91;i&#93; = data&#91;i&#93;&#91;j&#93;;\n\n    return Matrix(result);\n  }\n};\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iomanip&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;iostream&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&lt;vector&gt;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">template<\/span><span style=\"color: #D4D4D4\"> &lt;<\/span><span style=\"color: #569CD6\">typename<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">T<\/span><span style=\"color: #D4D4D4\">&gt;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">private:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;T&gt;&gt; data;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> rows, cols;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">public:<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Constructor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">T<\/span><span style=\"color: #D4D4D4\">&gt;&gt; <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      : <\/span><span style=\"color: #DCDCAA\">data<\/span><span style=\"color: #D4D4D4\">(values), <\/span><span style=\"color: #DCDCAA\">rows<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()), <\/span><span style=\"color: #DCDCAA\">cols<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">values<\/span><span style=\"color: #D4D4D4\">&#91;<\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">&#93;.<\/span><span style=\"color: #DCDCAA\">size<\/span><span style=\"color: #D4D4D4\">()) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Getters<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getRows<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> rows;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">getCols<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> cols;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Print Matrix<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">auto<\/span><span style=\"color: #D4D4D4\"> &amp;row : data) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (T val : row)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::fixed &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">setprecision<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">) &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">setw<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">) &lt;&lt; val &lt;&lt; <\/span><span style=\"color: #CE9178\">&quot; &quot;<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Overload print method so text can also be printed before the Matrix is printed<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">void<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #4EC9B0\">string<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">text<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; text &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">this<\/span><span style=\"color: #D4D4D4\">-&gt;<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::cout &lt;&lt; <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::endl;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ ---------- The Matrix operations ---------------------------------------------------------<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Matrix Addition<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">operator+<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (rows != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rows<\/span><span style=\"color: #D4D4D4\"> || cols != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">invalid_argument<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix dimensions must match for addition.&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;T&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(rows, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">T<\/span><span style=\"color: #D4D4D4\">&gt;(cols));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; cols; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; = <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; + <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Matrix Multiplication<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">operator*<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">&amp;<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">if<\/span><span style=\"color: #D4D4D4\"> (cols != <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">rows<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">throw<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">invalid_argument<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Invalid dimensions for matrix multiplication.&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;T&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(rows, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">T<\/span><span style=\"color: #D4D4D4\">&gt;(<\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">cols<\/span><span style=\"color: #D4D4D4\">; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> k = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; k &lt; cols; ++k) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">          <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93; += <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;k&#93; * <\/span><span style=\"color: #9CDCFE\">other<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;k&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">  \/\/ Transpose<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #4EC9B0\">Matrix<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">transpose<\/span><span style=\"color: #D4D4D4\">() <\/span><span style=\"color: #569CD6\">const<\/span><span style=\"color: #D4D4D4\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;<\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::vector&lt;T&gt;&gt; <\/span><span style=\"color: #DCDCAA\">result<\/span><span style=\"color: #D4D4D4\">(cols, <\/span><span style=\"color: #4EC9B0\">std<\/span><span style=\"color: #D4D4D4\">::<\/span><span style=\"color: #DCDCAA\">vector<\/span><span style=\"color: #D4D4D4\">&lt;<\/span><span style=\"color: #4EC9B0\">T<\/span><span style=\"color: #D4D4D4\">&gt;(rows));<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> i = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; i &lt; rows; ++i)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">size_t<\/span><span style=\"color: #D4D4D4\"> j = <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">; j &lt; cols; ++j)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #9CDCFE\">result<\/span><span style=\"color: #D4D4D4\">&#91;j&#93;&#91;i&#93; = <\/span><span style=\"color: #9CDCFE\">data<\/span><span style=\"color: #D4D4D4\">&#91;i&#93;&#91;j&#93;;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">Matrix<\/span><span style=\"color: #D4D4D4\">(result);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">};<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Test Harness(es)<\/h1>\n\n\n\n<p>It&#8217;s test harness time! We could write a single test harness that tests all three matrix operations we have implemented, or we could write a separate test harness for each operation. For this example, we&#8217;ll go for the latter as it offers us more flexibility (i.e. with matrix dimensions).<\/p>\n\n\n\n<p>You should also test the validity of the results produced by our Matrix class with an online matrix calculator, such as: <a href=\"https:\/\/matrixcalc.org\/\">https:\/\/matrixcalc.org\/<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Addition Test Harness<\/h2>\n\n\n\n<p>Create a file called <code>matrix-addition.cpp<\/code> with the following:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include \"matrix.h\"\n\nint main() {\n\n  Matrix&lt;double> A({{3, 8, 2, 1},\n                    {5, 2, 9, 4},\n                    {8, 2, 6, 11}});\n\n  Matrix&lt;double> B({{13, 9, 7, 13},\n                    {8, 7, 4, 6},\n                    {6, 4, 0, 3}});\n\n  A.print(\"Matrix A:\");\n  B.print(\"Matrix B:\");\n\n  Matrix&lt;double> C = A + B;\n  C.print(\"Matrix C = A + B:\");\n\n  return 0;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&quot;matrix.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #DCDCAA\">A<\/span><span style=\"color: #D4D4D4\">({{<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">}});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #DCDCAA\">B<\/span><span style=\"color: #D4D4D4\">({{<\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">}});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">A<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix A:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">B<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix B:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; C = A + B;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">C<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix C = A + B:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>To compile and run the above matrix addition test harness:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$ g++ matrix-addition.cpp \n$ .\/a.out \n\nMatrix A:\n    3.0000     8.0000     2.0000     1.0000 \n    5.0000     2.0000     9.0000     4.0000 \n    8.0000     2.0000     6.0000    11.0000 \n\nMatrix B:\n   13.0000     9.0000     7.0000    13.0000 \n    8.0000     7.0000     4.0000     6.0000 \n    6.0000     4.0000     0.0000     3.0000 \n\nMatrix C = A + B:\n   16.0000    17.0000     9.0000    14.0000 \n   13.0000     9.0000    13.0000    10.0000 \n   14.0000     6.0000     6.0000    14.0000 \n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">$ g++ matrix-addition.cpp <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">$ .\/a.out <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix A:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    3.0000     8.0000     2.0000     1.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    5.0000     2.0000     9.0000     4.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    8.0000     2.0000     6.0000    11.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   13.0000     9.0000     7.0000    13.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    8.0000     7.0000     4.0000     6.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    6.0000     4.0000     0.0000     3.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix C = A + B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   16.0000    17.0000     9.0000    14.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   13.0000     9.0000    13.0000    10.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   14.0000     6.0000     6.0000    14.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Multiplication Test Harness<\/h2>\n\n\n\n<p>Similar to the above matrix addition test harness, except this time we create a file called <code>matrix-multiplication.cpp <\/code>with the following:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include \"matrix.h\"\n\nint main() {\n\n  Matrix&lt;double> A({{3, 4, 2}});\n\n  Matrix&lt;double> B({{13, 9, 7, 13},\n                    {8, 7, 4, 6},\n                    {6, 4, 0, 3}});\n\n  A.print(\"Matrix A:\");\n  B.print(\"Matrix B:\");\n\n  Matrix&lt;double> C = A * B;\n  C.print(\"Matrix C = A * B:\");\n\n  return 0;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&quot;matrix.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #DCDCAA\">A<\/span><span style=\"color: #D4D4D4\">({{<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">}});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #DCDCAA\">B<\/span><span style=\"color: #D4D4D4\">({{<\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">13<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">}});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">A<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix A:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">B<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix B:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; C = A * B;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">C<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix C = A * B:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Again, compile and test (not forgetting to test the results with an online matrix calculator):<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$ g++ matrix-multiplication.cpp \n$ .\/a.out \n\nMatrix A:\n    3.0000     4.0000     2.0000 \n\nMatrix B:\n   13.0000     9.0000     7.0000    13.0000 \n    8.0000     7.0000     4.0000     6.0000 \n    6.0000     4.0000     0.0000     3.0000 \n\nMatrix C = A * B:\n   83.0000    63.0000    37.0000    69.0000 <\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">$ g++ matrix-multiplication.cpp <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">$ .\/a.out <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix A:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    3.0000     4.0000     2.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   13.0000     9.0000     7.0000    13.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    8.0000     7.0000     4.0000     6.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    6.0000     4.0000     0.0000     3.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix C = A * B:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   83.0000    63.0000    37.0000    69.0000 <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Matrix Transpose Test Harness<\/h2>\n\n\n\n<p>Last one &#8211; create a file called <code>matrix-transpose.cpp<\/code> with the following:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#include \"matrix.h\"\n\nint main() {\n\n  Matrix&lt;double> A({{1, 2, 3, 4},\n                    {5, 6, 7, 8},\n                    {9, 10, 11, 12}});\n\n  A.print(\"Matrix A:\");\n  Matrix&lt;double> B = A.transpose();\n  B.print(\"Matrix A after transpose():\");\n\n  Matrix&lt;double> C = B.transpose();\n  C.print(\"After transpose() again:\");\n\n  return 0;\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">#include<\/span><span style=\"color: #569CD6\"> <\/span><span style=\"color: #CE9178\">&quot;matrix.h&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">int<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">main<\/span><span style=\"color: #D4D4D4\">() {<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; <\/span><span style=\"color: #DCDCAA\">A<\/span><span style=\"color: #D4D4D4\">({{<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">6<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">7<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">8<\/span><span style=\"color: #D4D4D4\">},<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">                    {<\/span><span style=\"color: #B5CEA8\">9<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">10<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">11<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">12<\/span><span style=\"color: #D4D4D4\">}});<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">A<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix A:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; B = <\/span><span style=\"color: #9CDCFE\">A<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">transpose<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">B<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Matrix A after transpose():&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  Matrix&lt;<\/span><span style=\"color: #569CD6\">double<\/span><span style=\"color: #D4D4D4\">&gt; C = <\/span><span style=\"color: #9CDCFE\">B<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">transpose<\/span><span style=\"color: #D4D4D4\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #9CDCFE\">C<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;After transpose() again:&quot;<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">0<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Compile and run the matrix transpose test harness:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>$ g++ matrix-transpose.cpp \n$ .\/a.out \n\nMatrix A:\n    1.0000     2.0000     3.0000     4.0000 \n    5.0000     6.0000     7.0000     8.0000 \n    9.0000    10.0000    11.0000    12.0000 \n\nMatrix A after transpose():\n    1.0000     5.0000     9.0000 \n    2.0000     6.0000    10.0000 \n    3.0000     7.0000    11.0000 \n    4.0000     8.0000    12.0000 \n\nAfter transpose() again:\n    1.0000     2.0000     3.0000     4.0000 \n    5.0000     6.0000     7.0000     8.0000 \n    9.0000    10.0000    11.0000    12.0000 <\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">$ g++ matrix-transpose.cpp <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">$ .\/a.out <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix A:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    1.0000     2.0000     3.0000     4.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    5.0000     6.0000     7.0000     8.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    9.0000    10.0000    11.0000    12.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">Matrix A after transpose():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    1.0000     5.0000     9.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    2.0000     6.0000    10.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    3.0000     7.0000    11.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    4.0000     8.0000    12.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"><\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">After transpose() again:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    1.0000     2.0000     3.0000     4.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    5.0000     6.0000     7.0000     8.0000 <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    9.0000    10.0000    11.0000    12.0000 <\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>This is a <strong>very simple<\/strong> example of a matrix class. It is by no means a complete\/exhaustive implementation, but it should be enough to create neural networks. It&#8217;s simplicity will also serve as a clear example of how we can can use &#8220;compute&#8221; on GPUs to execute matrix operations in a highly parallel manner.<\/p>\n\n\n\n<p>The next post in this series will use our Matrix class to implement a neural network. For now, that&#8217;s it! As a wise synthetic once said:<\/p>\n\n\n\n<p><em>&#8220;Big things have small beginnings&#8221;<\/em> \ud83d\ude42<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Matrices are a fundamental building block in many computational applications, particularly in the realm of scientific computing (e.g. CFD &#8211; Computational Fluid Dynamics) and machine learning. The architecture of a matrix class must be carefully crafted to: In this post we&#8217;re going to create a matrix class that can perform: In later posts, we will<a class=\"moretag\" href=\"https:\/\/blog.syddel.uk\/?p=906\"><span class=\"screen-reader-text\">Read more about Simple C++ Matrix Class<\/span>[&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":942,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[21,19],"tags":[22,23],"class_list":["post-906","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-coding","tag-ai","tag-matrix"],"_links":{"self":[{"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/posts\/906","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=906"}],"version-history":[{"count":27,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/posts\/906\/revisions"}],"predecessor-version":[{"id":944,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/posts\/906\/revisions\/944"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=\/wp\/v2\/media\/942"}],"wp:attachment":[{"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=906"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=906"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.syddel.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=906"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}