<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[n-dimensionale Matrizen addieren]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich denke nicht dass sowas in der Realität relevant wäre, aber ich versuche hier gerade eine n-dimensionale Klasse für Matrizen zu bauen.<br />
Najo, die sollte man natürlich auch miteinander addieren können. Aber wie, da hab ich im Moment Probleme mit.</p>
<p>Mein momentaner Ansatz ist:</p>
<pre><code class="language-cpp">template&lt;typename OtherDataT&gt;
inline MatrixBase&lt;DataT, Dimensions&gt;&amp; add(
  MatrixBase&lt;OtherDataT, Dimensions&gt; const&amp; matrix)
{
  addMatrixRow(this-&gt;m_matrix, matrix.m_matrix, 1);
}

typedef&lt;typename ContentT&gt;
void addMatrixRow(std::vector&lt;ContentT&gt;&amp; left,
  std::vector&lt;ContentT&gt; const&amp; right, size_t depth)
{
  typedef typename std::vector&lt;ContentT&gt; RowT;

  if(left.size() != right.size())
    throw InvalidMatrixOperation(
      &quot;Attempt to add matrices with different sizes&quot;);

  if(depth != Dimension)
  {
    for(RowT::size_type i = 0; i &lt; right.size(); ++i)
      addMatrixRow(left[i], right[i], depth + 1);
  }
  else
  {
    for(RowT::size_type i = 0; i &lt; right.size(); ++i)
      left[i] += right[i];
  }
}
</code></pre>
<p>wobei m_matrix ein n-fach verschachtelter Vektor von double/std::complex ist.</p>
<p>Was aber ja leider nicht funktioniert.</p>
<p>Meine einzige Idee war es, mein Wissen auszunutzen, dass ein Vektor bei jedem Datentyp ein exakt identisches Speicherlayout hat, nur der Storage ist anders.<br />
So könnte ich eigentlich std::vector&lt;void*&gt; durchhangeln bis depth == Dimension und zu nem double-Vektoren casten.</p>
<p>Finde ich aber reichlich unelegant. Hat jemand eventuell eine schönere Lösung dafür? So töte ich ja das ganze Typsystem ...</p>
<p>Danke!<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286590/n-dimensionale-matrizen-addieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 20:46:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286590.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 May 2011 17:32:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 17:33:42 GMT]]></title><description><![CDATA[<p>Hoi! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich denke nicht dass sowas in der Realität relevant wäre, aber ich versuche hier gerade eine n-dimensionale Klasse für Matrizen zu bauen.<br />
Najo, die sollte man natürlich auch miteinander addieren können. Aber wie, da hab ich im Moment Probleme mit.</p>
<p>Mein momentaner Ansatz ist:</p>
<pre><code class="language-cpp">template&lt;typename OtherDataT&gt;
inline MatrixBase&lt;DataT, Dimensions&gt;&amp; add(
  MatrixBase&lt;OtherDataT, Dimensions&gt; const&amp; matrix)
{
  addMatrixRow(this-&gt;m_matrix, matrix.m_matrix, 1);
}

typedef&lt;typename ContentT&gt;
void addMatrixRow(std::vector&lt;ContentT&gt;&amp; left,
  std::vector&lt;ContentT&gt; const&amp; right, size_t depth)
{
  typedef typename std::vector&lt;ContentT&gt; RowT;

  if(left.size() != right.size())
    throw InvalidMatrixOperation(
      &quot;Attempt to add matrices with different sizes&quot;);

  if(depth != Dimension)
  {
    for(RowT::size_type i = 0; i &lt; right.size(); ++i)
      addMatrixRow(left[i], right[i], depth + 1);
  }
  else
  {
    for(RowT::size_type i = 0; i &lt; right.size(); ++i)
      left[i] += right[i];
  }
}
</code></pre>
<p>wobei m_matrix ein n-fach verschachtelter Vektor von double/std::complex ist.</p>
<p>Was aber ja leider nicht funktioniert.</p>
<p>Meine einzige Idee war es, mein Wissen auszunutzen, dass ein Vektor bei jedem Datentyp ein exakt identisches Speicherlayout hat, nur der Storage ist anders.<br />
So könnte ich eigentlich std::vector&lt;void*&gt; durchhangeln bis depth == Dimension und zu nem double-Vektoren casten.</p>
<p>Finde ich aber reichlich unelegant. Hat jemand eventuell eine schönere Lösung dafür? So töte ich ja das ganze Typsystem ...</p>
<p>Danke!<br />
Grüße,<br />
Ethon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062395</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 12 May 2011 17:33:42 GMT</pubDate></item><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 17:39:25 GMT]]></title><description><![CDATA[<p>Was genau ist denn Dimension? Und wie hast du diesen n-fach geschachtelten vector&lt;&gt; definiert?</p>
<p>(nur mal ein Gedanke: Eventuell wäre std::valarray besser als unterliegender Datentyp geeignet)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062398</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 12 May 2011 17:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 17:43:05 GMT]]></title><description><![CDATA[<blockquote>
<p>aber ich versuche hier gerade eine n-dimensionale Klasse für Matrizen zu bauen.</p>
</blockquote>
<blockquote>
<p>wobei m_matrix ein n-fach verschachtelter Vektor von double/std::complex ist.</p>
</blockquote>
<p>Ich glaube, in diesem Widerspruch liegt das Problem.</p>
<p>Schreib doch ein richtiges Klassentemplate mit vernünftigen Zugriffsoperatoren, dann sehe ich da keine wesentlichen Probleme beim Addieren von N-dimensionalen Matrizen, was man dann durch ein rekursives Template lösen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062401</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 12 May 2011 17:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 17:45:06 GMT]]></title><description><![CDATA[<p>Den Vektor definiere ich so (nbicht schlagen, mein erster Versuch in Sachen Template-Metaprogramming):</p>
<pre><code class="language-cpp">namespace internal
  {
    template&lt;typename DataT, size_t Dimensions&gt;
    struct BuildMatrix
    {
      static_assert(Dimensions &lt; 0, &quot;Zero or negative dimension supplied!&quot;);

      typedef std::vector&lt;typename BuildMatrix&lt;DataT,
        Dimensions - 1&gt;::Type&gt; Type;
    };

    template&lt;typename DataT&gt;
    struct BuildMatrix&lt;DataT, 1&gt;
    {
      typedef std::vector&lt;DataT&gt; Type;
    };
  }
</code></pre>
<p>Mit valarray hab ich mich ehrlich gesagt noch nie beschäftigt, werde ich mir mal ansehen, danke. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062402</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062402</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 12 May 2011 17:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 18:01:43 GMT]]></title><description><![CDATA[<p>Es sieht auf jeden Fall verwendbar aus. Ich würde nun die Addition rekursiv über diese Struktur definieren:</p>
<pre><code class="language-cpp">//Standardfall - vector&lt;...&gt;
template&lt;typename Sub&gt; vector&lt;Sub&gt; add_matrix(const vector&lt;Sub&gt;&amp; l, const vector&lt;Sub&gt;&amp; r)
{
  assert(r.size()==l.size());
  vector&lt;Sub&gt; res(r.size());
  transform(l.begin(),l.end(),r.begin(),res.begin(),add_matrix);
  return res;
}

//Rekursionsabbruch - double, complex o.ä.
template&lt;typename Num&gt; Num add_matrix(Num l, Num r)
{
  return l+r;
}
</code></pre>
<p>(ohne Garantie)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062408</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 12 May 2011 18:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to n-dimensionale Matrizen addieren on Thu, 12 May 2011 18:09:50 GMT]]></title><description><![CDATA[<p>Sollte da nicht auch irgendwie fix sein, wie groß eine Dimension jeweils ist?</p>
<p>Wie dem auch sein, hier ein bisschen ungetesteter Code:</p>
<pre><code class="language-cpp">typedef&lt;typename ContentT, size_t dimensions&gt;
Matrixklasse&lt;ContentT, dimensions&gt; operator+(const Matrixklasse&lt;ContenT, dimensions&gt; &amp;left, const Matrixklasse&lt;ContenT, dimensions&gt; &amp;right)
{
  if(left.size() != right.size())
    throw InvalidMatrixOperation(&quot;Attempt to add matrices with different sizes&quot;);
  Matrixklasse&lt;ContentT, dimensions&gt; result;

  for(size_t i = 0; i &lt; left.size(); ++i)
    result.push_back(left[i] + right[i]);  // Hier angenommen, dass die Matrixklasse das push_back von vector erbt.

  return result;
}
</code></pre>
<p>Nach dem Prinzip sollte das eigentlich funktionieren (bin jedoch in der TMP auch nicht mehr so fit, als dass ich immer alles im Blick habe, daher ohne Gewähr). Die Templaterekursion bricht von alleine ab, wenn die Dimension 1 ist, da dann <code>left[i]</code> und <code>right[i]</code> nur mehr vom Typ <code>ContentT</code> sind und nicht vom Typ <code>Matrixklasse&lt;ContenT, dimensions-1&gt;</code> wie in den vorherigen Durchgängen.</p>
<p>edit: Zu langsam...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2062412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2062412</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 12 May 2011 18:09:50 GMT</pubDate></item></channel></rss>