Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Since non of the answers worked for me, I made my own class. The class works well for me. But I am pretty sure it is not designed so C++'y. It also may result in memory leaks. If you found a problem with it, please leave me a comment. I'd upgrade the code if I made a new version to keep the answer useful for others. By the way, the class works for 1, 2, and 3 dimensions now, but it can be easily extended to any number of dimensions. Here is the code,</p> <pre><code>#ifndef XARRAY_H_INCLUDED #define XARRAY_H_INCLUDED #include &lt;string&gt; #include &lt;sstream&gt; #include &lt;vector&gt; #include &lt;assert.h&gt; using namespace std; template &lt;class T = double&gt; class XArray { // Fields (keep data) int index_helper[10]; // cells of the array vector&lt;T&gt; table; // dimensions of the array vector&lt;int&gt; dims; public: XArray(){} XArray(unsigned int n, int *d) { dims.resize(n); int size = 1; for (unsigned int i = 0; i &lt; n; i++) { size *= d[i]; dims[i] = d[i]; } table.resize(size); } XArray(unsigned int d1) { dims.resize(1); dims[0] = d1; table.resize(d1); } XArray(unsigned int d1, unsigned int d2) { dims.resize(2); dims[0] = d1; dims[1] = d2; table.resize(d1 * d2); } XArray(unsigned int d1, unsigned int d2, unsigned int d3) { dims.resize(3); dims[0] = d1; dims[1] = d2; dims[2] = d3; table.resize(d1 * d2 * d3); } XArray(const XArray&lt;T&gt;&amp; xa) { this-&gt;table = xa.table; this-&gt;dims = xa.dims; } int dim(int i) { return dims[i]; } int num_dims() { return dims.size(); } T&amp; operator()(int i) { index_helper[0] = i; return get_helper(1, index_helper); } T&amp; operator()(int i, int j) { index_helper[0] = i; index_helper[1] = j; return get_helper(2, index_helper); } T&amp; operator()(int i, int j, int k) { index_helper[0] = i; index_helper[1] = j; index_helper[2] = k; return get_helper(3, index_helper); } XArray&lt;T&gt; operator*(double m) { XArray&lt;T&gt; r = *this; for (unsigned int i = 0; i &lt; table.size(); i++) { r.table[i] *= m; } return r; } XArray&lt;T&gt; operator/(double m) { XArray&lt;T&gt; r = *this; for (unsigned int i = 0; i &lt; table.size(); i++) { r.table[i] /= m; } return r; } XArray&lt;T&gt; operator+(const XArray&lt;T&gt; &amp;that) { assert(this-&gt;dims.size() == that.dims.size()); for (unsigned int i = 0; i &lt; dims.size(); i++) { assert(this-&gt;dims[i] == that.dims[i]); } XArray&lt;T&gt; r = *this; for (unsigned int i = 0; i &lt; table.size(); i++) { r.table[i] += that.table[i]; } return r; } XArray&lt;T&gt; operator-(const XArray&lt;T&gt; &amp;that) { assert(this-&gt;dims.size() == that.dims.size()); for (unsigned int i = 0; i &lt; dims.size(); i++) { assert(this-&gt;dims[i] == that.dims[i]); } XArray&lt;T&gt; r = *this; for (unsigned int i = 0; i &lt; table.size(); i++) { r.table[i] -= that.table[i]; } return r; } private: T&amp; get_helper(unsigned int n, int *indices) { assert(n == dims.size()); int multiplier = 1; int index = 0; for (unsigned int i = 0; i &lt; n; i++) { //cerr &lt;&lt; "index " &lt;&lt; i &lt;&lt; " out of range. Expected [0, " &lt;&lt; dims[i] - 1 // &lt;&lt; "] found " &lt;&lt; indices[i] &lt;&lt; endl; assert(indices[i] &gt;= 0 &amp;&amp; indices[i] &lt; dims[i]); index += indices[i] * multiplier; multiplier *= dims[i]; } return table[index]; } }; template &lt;class T&gt; ostream &amp;operator&lt;&lt;(ostream &amp;stream, XArray&lt;T&gt; xa) { int d = xa.num_dims(); if(d == 1) { int n = xa.dim(0); for(int i = 0; i &lt; n; i++) { stream &lt;&lt; xa(i); if(i &lt; n - 1) { stream &lt;&lt; ", "; } } } else { stream &lt;&lt; "XArray["; for(int i = 0; i &lt; d; i++) { stream &lt;&lt; xa.dim(i); if(i &lt; d - 1) { stream &lt;&lt; "x"; } } stream &lt;&lt; "]"; } return stream; } #endif // XARRAY_H_INCLUDED </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload