<?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[lookup tabelle]]></title><description><![CDATA[<p>Hallo alle zusamen ich bin neue hier ,ich habe eine frage<br />
wie kann ich diese schleife mit lookup tabelle realisieren ziel dabei ist der laufzeit zu minimieren</p>
<pre><code class="language-cpp">for(int iz = 0;iz&lt;n;++iz)
	{
		vector&lt;int&gt; f = vec[iz];
		double score = 0;
		for(int  is = 0;is&lt;m;++is)
		{	
				int y = y_vector[is];
				int v = f[is];
				double p_i = p_ivector[is];

				if(y==0)                
				{					
					 p=1.0-p_i;

                 }
                 else
				 {					
					  p=p_i;
                 }

				if(y== v) 
				 {		

					 score +=sqrt((1-p)/(p));					
                 }
                 else
                 {					
					 score -=sqrt((p)/(1-p));			

                 }
		}

		UserScore[iz] = score;
	}
</code></pre>
<p>Vielen danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296111/lookup-tabelle</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 02:53:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296111.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Nov 2011 11:49:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 11:49:46 GMT]]></title><description><![CDATA[<p>Hallo alle zusamen ich bin neue hier ,ich habe eine frage<br />
wie kann ich diese schleife mit lookup tabelle realisieren ziel dabei ist der laufzeit zu minimieren</p>
<pre><code class="language-cpp">for(int iz = 0;iz&lt;n;++iz)
	{
		vector&lt;int&gt; f = vec[iz];
		double score = 0;
		for(int  is = 0;is&lt;m;++is)
		{	
				int y = y_vector[is];
				int v = f[is];
				double p_i = p_ivector[is];

				if(y==0)                
				{					
					 p=1.0-p_i;

                 }
                 else
				 {					
					  p=p_i;
                 }

				if(y== v) 
				 {		

					 score +=sqrt((1-p)/(p));					
                 }
                 else
                 {					
					 score -=sqrt((p)/(1-p));			

                 }
		}

		UserScore[iz] = score;
	}
</code></pre>
<p>Vielen danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149902</guid><dc:creator><![CDATA[swiden]]></dc:creator><pubDate>Mon, 28 Nov 2011 11:49:46 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 12:00:34 GMT]]></title><description><![CDATA[<p>Man kann mit Lookuptabellen keine Schleifen optimieren, nur Rechnungen. Was sind denn bei deiner Rechnung hier die Eingabeparameter? Wenn es nur wenige sind, kannst du für den Gesamtcode eine Tabelle machen. Oder zumindest für eine Teilrechnung, wie die innere Schleife. Für die Rechnungen im inneren der Schleife lohnt es sich dann wahrscheinlich nicht mehr, an die Wurzelfunktion der CPU-Hardware wirst du mit einer Tabelle sicherlich nicht drankommen. Da kannst du höchstens noch versuchen mit ein bisschen Assembler den Compiler zu zwingen, die SSE-Wurzelfunktion zu benutzen, anstatt die viel langsamere x87-Wurzel. Aber nur, wenn dein Compiler das nicht sowieso schon macht! Wenn du dich mit geringerer Genauigkeit zufrieden gibst, kannst du da auch noch mehr rausholen:<br />
<a href="http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/" rel="nofollow">http://assemblyrequired.crashworks.org/2009/10/16/timing-square-root/</a></p>
<p>edit: Teste aber die Techniken aus dem verlinkten Artikel lieber nochmal selber. Als ich mal die im Artikel gelobte Quake3-Wurzel getestet habe, hat die gegen die Wurzelfunktion meiner (damals recht neuen) CPU verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149906</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 28 Nov 2011 12:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 12:02:35 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void Trace::score(vector&lt;double&gt; p_ivector,vector&lt;int&gt; y_vector,size_t n, size_t m,vector&lt; vector&lt;int&gt; &gt; &amp; vec, vector&lt;double&gt; &amp;UserScore)
{
	//vector &lt;double&gt; scoreVector(n);
	double p = 0.0;

	for(int iz = 0;iz&lt;n;++iz)
	{
		vector&lt;int&gt; f = vec[iz];
		double score = 0;
		for(int  is = 0;is&lt;m;++is)
		{	
				int y = y_vector[is];
				int v = f[is];
				double p_i = p_ivector[is];

				if(y==0)                
				{					
					 p=1.0-p_i;

                 }
                 else
				 {					
					  p=p_i;
                 }

				if(y== v) 
				 {		

					 score +=sqrt((1-p)/(p));					
                 }
                 else
                 {					
					 score -=sqrt((p)/(1-p));			

                 }
		}

		UserScore[iz] = score;
	}

}
</code></pre>
<p>ich wollte die funktion optimieren damit ich ein schnelere laufzeit habe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149909</guid><dc:creator><![CDATA[swiden]]></dc:creator><pubDate>Mon, 28 Nov 2011 12:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 12:21:34 GMT]]></title><description><![CDATA[<p>Na, das ist doch mal eine brauchbare Frage.</p>
<p>Wie groß sind die Vektoren? Ach, eigentlich fast egal. Übergabe sollte jedenfalls per Referenz erfolgen, das bringt schon einmal ungeheure Vorteile beim Aufruf der Funktion.</p>
<p>Ist vector&lt;vector&gt; wirklich nötig? Das ist schon sehr sehr indirekt und daher lahm. Meistens wird das von Anfängern gemacht, die das gar nicht brauchen und die eigentlich die innere Dimension fest haben wollen. Da ist dann ein std::array angebracht.</p>
<p>Musst du in Zeile 8 wirklich eine Kopie machen? So wie ich das sehe, reicht da ebenfalls eine Referenz.</p>
<p>Wenn ich das richtig sehe, ließe sich die gesamte Rechnung auch parallelisieren, wenn du das p erst dort definieren würdest, wo es gebraucht wird. Dann sind die Rechnungen zum iz nämlich komplett unabhängig. Bei vielen iz lohnt sich dann eine Parallelisierung.</p>
<p>Ansonsten drück mal möglichst <strong>präzise</strong> aus, was die Funktion überhaupt machen soll. Vielleicht kann man am Algorithmus selber noch was schrauben, anstatt nur an der technischen Umsetzung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149916</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 28 Nov 2011 12:21:34 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 12:32:06 GMT]]></title><description><![CDATA[<p>die vektoren größe: 5000<br />
meine matrix ist fast 5000 *1000(matrix mit 0und 1 ausgefuhlt)<br />
die copy im zeile 8 hat mich fast 7 secunden gebracht da ich die funktion 1000mal aufrufe<br />
die funktion soll den score für jede eintage in einem zeile rechen und am ende bekomme ich ein vektore UserScore[iz] = score; mit dem score für jede zeile</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149922</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149922</guid><dc:creator><![CDATA[swiden]]></dc:creator><pubDate>Mon, 28 Nov 2011 12:32:06 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 12:42:19 GMT]]></title><description><![CDATA[<p>5000 ist schon gut für Parallelisierung. Da solltest du mit etwas threadbasiertem wie OpenMP oder TBB auf einem Mehrkernprozessor gute Ergebnisse erzielen. Oder auch mit händisch erstellten Threads, wenn du es gerne umständlich magst, dafür aber mehr Kontrolle haben möchtest.</p>
<p>Da du dich nicht präzise ausdrücken möchtest, was du erreichen möchtest, ist das erst einmal alles was man sagen kann.</p>
<p>Die dicksten Klöpse sind jedenfalls erst einmal die ganzen Kopien, nicht nur Zeile 8 sondern eben auch bei der Parameterübergabe. Ich hoffe, die hast du ebenfalls weg gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149926</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 28 Nov 2011 12:42:19 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 16:23:01 GMT]]></title><description><![CDATA[<blockquote>
<p>meine matrix ist fast 5000 *1000(matrix mit 0und 1 ausgefuhlt)</p>
</blockquote>
<p>Wenn die &quot;innere&quot; Dimension eine konstante Größe hat, auf jeden Fall durch ein std::array ersetzen.</p>
<pre><code class="language-cpp">vector&lt; vector&lt;int&gt; &gt;
</code></pre>
<p>Hat den riesigen Nachteil das die inneren std::vector meist ihre Speicherbereiche verprenkelt haben und immer wenn ein neuer std::vector bearbeitet wird, erstmal ein CPU-Cachemiss auftritt.</p>
<p>Mit std::array/boost::array bzw einer eigenen Wrapperklasse für Arrays liegt der ganze Speicher am Stück, was massiv Zeit spart.</p>
<p>Alternativ kannst du, wenn beide Dimensionen dynamisch sein müssen, einen einfachen vector&lt;int&gt; mit n * m Größe nehmen und die Index-Zugriffe umrechen, spart auch sehr viel Zeit.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2150050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2150050</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 28 Nov 2011 16:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 16:34:53 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Alternativ kannst du, wenn beide Dimensionen dynamisch sein müssen, einen einfachen vector&lt;int&gt; mit n * m Größe nehmen und die Index-Zugriffe umrechen, spart auch sehr viel Zeit.</p>
</blockquote>
<p>Dann ist die innere Dimension aber nicht mehr dynamisch. Wenn sie dynamisch sein muss, dann führt nichts an vector&lt;vector&gt;&gt; vorbei, wenn sie statisch ist, dann sind vector&lt;array&gt; und vector(m*m) äquivalent.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2150058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2150058</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 28 Nov 2011 16:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 16:56:07 GMT]]></title><description><![CDATA[<p>Ohne zu wissen, was genau der Algorithmus macht, fällt jedenfalls auf, dass die komplexe Berechnung (Division und Wurzelziehen) nur von p_ivector abhängt. Dabei wird die Berechnung für jedes Element in p_ivector n mal wiederholt. Es würde sich also anbieten, diese Berechnung im voraus für jedes p_ivector-Element durchzuführen und das Ergebnis zu speichern. Der Rest ist dann im Prinzip nichts weiter als über diese Elemente mit einem geeigneten Prädikat zu akkumulieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2150066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2150066</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 28 Nov 2011 16:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 17:33:10 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<p>Alternativ kannst du, wenn beide Dimensionen dynamisch sein müssen, einen einfachen vector&lt;int&gt; mit n * m Größe nehmen und die Index-Zugriffe umrechen, spart auch sehr viel Zeit.</p>
</blockquote>
<p>Dann ist die innere Dimension aber nicht mehr dynamisch. Wenn sie dynamisch sein muss, dann führt nichts an vector&lt;vector&gt;&gt; vorbei, wenn sie statisch ist, dann sind vector&lt;array&gt; und vector(m*m) äquivalent.</p>
</blockquote>
<p>Ich hab mich falsch ausgedrückt, ich meinte wenn die Größen Laufzeitparameter sind. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2150083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2150083</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Mon, 28 Nov 2011 17:33:10 GMT</pubDate></item><item><title><![CDATA[Reply to lookup tabelle on Mon, 28 Nov 2011 18:30:26 GMT]]></title><description><![CDATA[<p>Das ganze mal mit Standardfunktionen geschrieben (ungetestet). Dann ist schon eher zu erkennen, was die Funktion eigentlich macht.</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cmath&gt;
#include &lt;cstddef&gt;
#include &lt;functional&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;
#include &lt;type_traits&gt;
#include &lt;tuple&gt;
#include &lt;utility&gt;
#include &lt;vector&gt;

void score(const std::vector&lt;double&gt;&amp; p_ivector, const std::vector&lt;int&gt;&amp; y_vector, std::vector&lt;std::vector&lt;int&gt;&gt;&amp; vec, std::vector&lt;double&gt;&amp; UserScore)
{
    std::vector&lt;std::tuple&lt;int, double, double&gt;&gt; p2;
    p2.reserve( p_ivector.size() );
    std::transform(
        p_ivector.cbegin(),
        p_ivector.cend(),
        y_vector.cbegin(),
        std::back_inserter( p2 ),
        [](double p, int y)
        {
            return y == 0
                ? std::make_tuple( y, std::sqrt( p / ( 1 - p ) ), -std::sqrt( ( 1 - p ) / p ) )
                : std::make_tuple( y, std::sqrt( ( 1 - p ) / p ), -std::sqrt( p / ( 1 - p ) ) );
        } );

    std::transform(
        vec.cbegin(),
        vec.cend(),
        UserScore.begin(),
        [&amp;](const std::vector&lt;int&gt;&amp; f)
        {
            return std::inner_product(
                p2.cbegin(),
                p2.cend(),
                f.begin(),
                0.0,
                std::plus&lt;double&gt;(),
                [](const std::tuple&lt;int, double, double&gt;&amp; t, int v)
                {
                    return std::get&lt;0&gt;( t ) == v ? std::get&lt;1&gt;( t ) : std::get&lt;2&gt;( t );
                } );
        } );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2150106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2150106</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 28 Nov 2011 18:30:26 GMT</pubDate></item></channel></rss>