{"componentChunkName":"component---src-templates-blog-post-js","path":"/matrix-multiplication-strassen","result":{"data":{"markdownRemark":{"html":"<p>The standard matrix multiplication for an n x n matrix results in a time complexity with a factor of 3. This means\nif you double the size of the matrix, you'll require eight times more time. Strassen's algorithm is one technique\nthat optimizes matrix multiplication, reducing time complexity to a factor of 2.8.</p>\n<p>The algorithm is named after the German mathematician <a href=\"https://en.wikipedia.org/wiki/Volker_Strassen\">Volker Strassen</a>,\nwho introduced it.</p>\n<h3>Conditions</h3>\n<ul>\n<li>The matrices should be square.</li>\n<li>Matrix size has to be a power of two. If the matrices do not meet these constraints, they are padded with\nrows and columns of zeros. </li>\n</ul>\n<h3>How it Works</h3>\n<ol>\n<li>If the matrices do not meet the above conditions, pad with rows and columns of zeros to get nice square matrices.</li>\n<li>Check if the matrix size is smaller than the threshold. If so use the standard multiplication.</li>\n<li>If not, proceed to Strassen's algorithm.</li>\n<li>Partition matrices into four equal size blocks.</li>\n<li>Use these partitions to calculate the seven matrices.</li>\n<li>Using the seven matrices, calculate the final matrix.</li>\n<li>Remove additional rows and columns (which are a result of padded zeros) to get the final matrix.</li>\n</ol>\n<h3>Pros</h3>\n<p>The final matrix is calculated in seven multiplication steps, whereas the standard method uses eight\nmultiplications. This results in reduced time complexity, hence optimizing multiplication. </p>\n<h3>Cons</h3>\n<p>The threshold at which the algorithm falls back to the standard method has a significant effect in optimization,\nparticularly when matrices of varying sizes need to be calculated. Threshold measures that work for large matrices\nmay not work for smaller matrices. </p>\n<p>Since most matrices usually require to be padded with zeros prior to applying the algorithm, the matrix size may\nbecome very large, hence increasing the time complexity. </p>\n<h3>Implementation</h3>\n<p>Here is a C++ implementation of Strassen's algorithm, using it to multiply matrices of size 1000.\nThe results can be compared with those from standard multiplication. </p>\n<div class=\"gatsby-highlight\" data-language=\"c\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-c line-numbers\"><code class=\"language-c\"><span class=\"token comment\">//optimized matrix multiplication using Strassen algorithm</span>\n    \n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;iostream></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;ctime></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;cstdlib></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;vector></span></span>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#</span><span class=\"token directive keyword\">include</span> <span class=\"token string\">&lt;cmath></span></span>\n\nusing namespace std<span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\">//size at which the sequential multiplication is used instead of recursive Strassen</span>\n<span class=\"token keyword\">int</span> thresholdSize <span class=\"token operator\">=</span> <span class=\"token number\">128</span><span class=\"token punctuation\">;</span>  \n\n<span class=\"token keyword\">void</span> <span class=\"token function\">initMat</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// initialize matrices and fill them with random values</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span><span class=\"token punctuation\">)</span><span class=\"token function\">rand</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">/</span>RAND_MAX<span class=\"token operator\">*</span><span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n            b<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">double</span><span class=\"token punctuation\">)</span><span class=\"token function\">rand</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">/</span>RAND_MAX<span class=\"token operator\">*</span><span class=\"token number\">10</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">multiplyMatStandard</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>c<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// standard matrix multiplication: C &lt;- C + A x B</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>j<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">double</span> temp  <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n            <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> k <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> k <span class=\"token operator\">&lt;</span> n<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>k<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n                temp <span class=\"token operator\">+=</span> a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token operator\">*</span> b<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n            c<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token operator\">=</span>temp<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">getNextPowerOfTwo</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">pow</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span><span class=\"token punctuation\">(</span><span class=\"token function\">ceil</span><span class=\"token punctuation\">(</span><span class=\"token function\">log2</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">fillZeros</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>newA<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>newB<span class=\"token punctuation\">,</span>\n       vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//pad matrix with zeros</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            newA<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            newB<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> b<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span>\n vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>resultMatrix<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            resultMatrix<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">+</span> b<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span>\n      vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>resultMatrix<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            resultMatrix<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> a<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">-</span> b<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">void</span> <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>a<span class=\"token punctuation\">,</span>\n    vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>b<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> <span class=\"token operator\">&amp;</span>c<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> n<span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\t\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">&lt;=</span>thresholdSize<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token function\">multiplyMatStandard</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> c<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//expand and fill with zeros if matrix size is not a power of two</span>\n        <span class=\"token keyword\">int</span> newSize <span class=\"token operator\">=</span> <span class=\"token function\">getNextPowerOfTwo</span><span class=\"token punctuation\">(</span>n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> \n            <span class=\"token function\">newA</span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">newB</span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">newC</span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">,</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>newSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>n<span class=\"token operator\">==</span>newSize<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>   \n            <span class=\"token comment\">//matrix size is already a power of two</span>\n            newA <span class=\"token operator\">=</span> a<span class=\"token punctuation\">;</span>\n            newB <span class=\"token operator\">=</span> b<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">fillZeros</span><span class=\"token punctuation\">(</span>newA<span class=\"token punctuation\">,</span> newB<span class=\"token punctuation\">,</span> a<span class=\"token punctuation\">,</span> b<span class=\"token punctuation\">,</span> n<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        \n        <span class=\"token comment\">//initialize submatrices</span>\n        <span class=\"token keyword\">int</span> blockSize <span class=\"token operator\">=</span> newSize<span class=\"token operator\">/</span><span class=\"token number\">2</span><span class=\"token punctuation\">;</span>  <span class=\"token comment\">//size for a partition matrix</span>\n        vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token function\">block</span> <span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> \n            <span class=\"token comment\">/*partitions of newA*/</span>\n            <span class=\"token function\">a11</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">a12</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">a21</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">a22</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token comment\">/*partitions of newB*/</span>\n            <span class=\"token function\">b11</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">b12</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">b21</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">b22</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token comment\">/*partitions of newC*/</span>\n            <span class=\"token function\">c11</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">c12</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">c21</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">c22</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token comment\">/*matrices storing intermediate results*/</span>\n            <span class=\"token function\">aBlock</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">bBlock</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token comment\">/*set of submatrices derived from partitions*/</span>\n            <span class=\"token function\">m1</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">m2</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">m3</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">m4</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>  \n            <span class=\"token function\">m5</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token function\">m6</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> \n            <span class=\"token function\">m7</span><span class=\"token punctuation\">(</span>blockSize<span class=\"token punctuation\">,</span> block<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n        \n        <span class=\"token comment\">//partition matrices</span>\n        <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>blockSize<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>blockSize<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n                a11<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newA<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                a12<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newA<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                a21<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newA<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                a22<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newA<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                b11<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newB<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                b12<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newB<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                b21<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newB<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                b22<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newB<span class=\"token punctuation\">[</span>i<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token operator\">+</span>blockSize<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n    \n        <span class=\"token comment\">//compute submatrices</span>\n        <span class=\"token comment\">//m1 = (a11+a22)(b11+b22)</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a11<span class=\"token punctuation\">,</span> a22<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>b11<span class=\"token punctuation\">,</span> b22<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> m1<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n        <span class=\"token comment\">//m2 = (a21+a22)b11</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a21<span class=\"token punctuation\">,</span> a22<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> b11<span class=\"token punctuation\">,</span> m2<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//m3 = a11(b12-b22)</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>b12<span class=\"token punctuation\">,</span> b22<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>a11<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> m3<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//m4 = a22(b21-b11)</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>b21<span class=\"token punctuation\">,</span> b11<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>a22<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> m4<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//m5 = (a11+a12)b22</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>a11<span class=\"token punctuation\">,</span> a12<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> b22<span class=\"token punctuation\">,</span> m5<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//m6 = (a21-a11)(b11+b12)</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>a21<span class=\"token punctuation\">,</span> a11<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>b11<span class=\"token punctuation\">,</span> b12<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> m6<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n        <span class=\"token comment\">//m7 = (a12-a22)(b12+b22)</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>a12<span class=\"token punctuation\">,</span> a22<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>b12<span class=\"token punctuation\">,</span> b22<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> m7<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//calculate result submatrices</span>\n        <span class=\"token comment\">//c11 = m1+m4-m5+m7</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>m1<span class=\"token punctuation\">,</span> m4<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> m5<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>bBlock<span class=\"token punctuation\">,</span> m7<span class=\"token punctuation\">,</span> c11<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//c12 = m3+m5</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>m3<span class=\"token punctuation\">,</span> m5<span class=\"token punctuation\">,</span> c12<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//c21 = m2+m4</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>m2<span class=\"token punctuation\">,</span> m4<span class=\"token punctuation\">,</span> c12<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n        <span class=\"token comment\">//c22 = m1-m2+m3+m6</span>\n        <span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>m1<span class=\"token punctuation\">,</span> m2<span class=\"token punctuation\">,</span> aBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>aBlock<span class=\"token punctuation\">,</span> m3<span class=\"token punctuation\">,</span> bBlock<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">add</span><span class=\"token punctuation\">(</span>bBlock<span class=\"token punctuation\">,</span> m6<span class=\"token punctuation\">,</span> c22<span class=\"token punctuation\">,</span> blockSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//calculate final result matrix</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>blockSize<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>blockSize<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n                newC<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c11<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                newC<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>blockSize<span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c12<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                newC<span class=\"token punctuation\">[</span>blockSize<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c21<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n                newC<span class=\"token punctuation\">[</span>blockSize<span class=\"token operator\">+</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>blockSize<span class=\"token operator\">+</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> c22<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n    \n        <span class=\"token comment\">//remove additional values from expanded matrix</span>\n        <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">for</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> j<span class=\"token operator\">=</span><span class=\"token number\">0</span><span class=\"token punctuation\">;</span> j<span class=\"token operator\">&lt;</span>n<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n                c<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> newC<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">double</span> <span class=\"token function\">calculateMean</span><span class=\"token punctuation\">(</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> data<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> size<span class=\"token punctuation\">)</span> \n<span class=\"token punctuation\">{</span>\n   <span class=\"token keyword\">double</span> sum <span class=\"token operator\">=</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">,</span> mean <span class=\"token operator\">=</span> <span class=\"token number\">0.0</span><span class=\"token punctuation\">;</span>\n   <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> size<span class=\"token punctuation\">;</span> <span class=\"token operator\">++</span>i<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n       sum <span class=\"token operator\">+=</span> data<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n   <span class=\"token punctuation\">}</span>\n\n   mean <span class=\"token operator\">=</span> sum <span class=\"token operator\">/</span> size<span class=\"token punctuation\">;</span>\n   <span class=\"token keyword\">return</span> mean<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> argc<span class=\"token punctuation\">,</span> <span class=\"token keyword\">char</span> <span class=\"token operator\">*</span>argv<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token function\">srand</span><span class=\"token punctuation\">(</span><span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">//seed for random number generation</span>\n    \n    <span class=\"token comment\">// number of sample size considered to evaluate average execution time</span>\n    <span class=\"token keyword\">int</span> sampleSize <span class=\"token operator\">=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span>       \n    <span class=\"token keyword\">int</span> matSize <span class=\"token operator\">=</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>       \n    <span class=\"token keyword\">double</span> startTime<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">double</span> elapsedTime<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">double</span> standardMean<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">double</span> strassenMean<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token comment\">//set threshold value if given by user</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>argc<span class=\"token operator\">></span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        thresholdSize <span class=\"token operator\">=</span> <span class=\"token function\">atoi</span><span class=\"token punctuation\">(</span>argv<span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>  \n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">//vectors storing execution time values</span>\n    vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token function\">standardTime</span><span class=\"token punctuation\">(</span>sampleSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>      \n    vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token function\">strassenTime</span><span class=\"token punctuation\">(</span>sampleSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> k <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> k <span class=\"token operator\">&lt;</span> sampleSize<span class=\"token punctuation\">;</span> k<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//initialize vectors for matrices a, b, c: a*b = c</span>\n        vector<span class=\"token operator\">&lt;</span> vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span> <span class=\"token operator\">></span> \n            <span class=\"token function\">a</span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">,</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token function\">b</span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">,</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token function\">c</span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">,</span>vector<span class=\"token operator\">&lt;</span><span class=\"token keyword\">double</span><span class=\"token operator\">></span><span class=\"token punctuation\">(</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\t\n        \n        <span class=\"token function\">initMat</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span>b<span class=\"token punctuation\">,</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//standard execution\t\t</span>\n        startTime <span class=\"token operator\">=</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyMatStandard</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span>b<span class=\"token punctuation\">,</span>c<span class=\"token punctuation\">,</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        elapsedTime <span class=\"token operator\">=</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> startTime<span class=\"token punctuation\">;</span>\n        standardTime<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> elapsedTime<span class=\"token punctuation\">;</span>\n        \n        <span class=\"token comment\">//multiplication using Strassen's </span>\n        startTime <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\t\t\t\n        startTime <span class=\"token operator\">=</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">multiplyStrassen</span><span class=\"token punctuation\">(</span>a<span class=\"token punctuation\">,</span>b<span class=\"token punctuation\">,</span>c<span class=\"token punctuation\">,</span>matSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        elapsedTime <span class=\"token operator\">=</span> <span class=\"token function\">time</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">-</span> startTime<span class=\"token punctuation\">;</span>\n        strassenTime<span class=\"token punctuation\">[</span>k<span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> elapsedTime<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Standard multiplication\"</span><span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    standardMean <span class=\"token operator\">=</span> <span class=\"token function\">calculateMean</span><span class=\"token punctuation\">(</span>standardTime<span class=\"token punctuation\">,</span> sampleSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Average time taken to execute matrices of size - \"</span> \n        <span class=\"token operator\">&lt;&lt;</span> matSize <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" : \"</span> <span class=\"token operator\">&lt;&lt;</span> standardMean <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    \n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Multiplication using Strassen's\"</span><span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Threshold used: \"</span><span class=\"token operator\">&lt;&lt;</span> thresholdSize <span class=\"token operator\">&lt;&lt;</span>endl<span class=\"token punctuation\">;</span>\n    strassenMean <span class=\"token operator\">=</span> <span class=\"token function\">calculateMean</span><span class=\"token punctuation\">(</span>strassenTime<span class=\"token punctuation\">,</span> sampleSize<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Average time taken to execute matrices of size - \"</span> \n        <span class=\"token operator\">&lt;&lt;</span> matSize <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" : \"</span> <span class=\"token operator\">&lt;&lt;</span> strassenMean <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    \n    cout <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\"Speed up gained by using Strassen's-\"</span> <span class=\"token operator\">&lt;&lt;</span> matSize \n        <span class=\"token operator\">&lt;&lt;</span> <span class=\"token string\">\" : \"</span> <span class=\"token operator\">&lt;&lt;</span> standardMean<span class=\"token operator\">/</span>strassenMean <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    cout <span class=\"token operator\">&lt;&lt;</span> endl<span class=\"token punctuation\">;</span>\n    \n    <span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h3>Results</h3>\n<p>Above execution gave a speed increase of 2.</p>\n<p><img src=\"https://user-images.githubusercontent.com/10103699/133361947-bde10cb5-8c51-4cda-9da4-a591f298f45f.png\" alt=\"str1\"></p>","frontmatter":{"date":"July 06, 2017","path":"/matrix-multiplication-strassen","title":"Optimising Matrix Multiplication using Strassen's Algorithm","tags":["How to","C++"]}}},"pageContext":{}},"staticQueryHashes":["3649515864"]}