<?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[Diskretisieren von Messwerten (optimieren)]]></title><description><![CDATA[<p>Hi,<br />
ich habe mir folgendes Stückchen Code zurecht gebastelt um damit Messwerte in ein Feld zu sortieren.</p>
<pre><code class="language-cpp">int diskret(double in, double min, double max, int slots)
{
//in Messwert
//min, max Intervall
//slots Maximaler Index
	if((in &gt;= min) &amp;&amp; (in &lt; max))
	{
		double b = (max - min) / (slots + 1);
		double tmp = in - min;
		tmp = tmp / b;
		return int(tmp);
	}
	else
		return -1;
}
</code></pre>
<p>Ich erhalte jetzt zu einem eingegebenen Wert den Feldindex.</p>
<p>Mich würde nun interessierem, ob man hier noch etwas mehr Geschwindigkeit rausholen kann und wie.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/127986/diskretisieren-von-messwerten-optimieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 09:22:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/127986.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Nov 2005 12:49:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Tue, 29 Nov 2005 12:49:14 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe mir folgendes Stückchen Code zurecht gebastelt um damit Messwerte in ein Feld zu sortieren.</p>
<pre><code class="language-cpp">int diskret(double in, double min, double max, int slots)
{
//in Messwert
//min, max Intervall
//slots Maximaler Index
	if((in &gt;= min) &amp;&amp; (in &lt; max))
	{
		double b = (max - min) / (slots + 1);
		double tmp = in - min;
		tmp = tmp / b;
		return int(tmp);
	}
	else
		return -1;
}
</code></pre>
<p>Ich erhalte jetzt zu einem eingegebenen Wert den Feldindex.</p>
<p>Mich würde nun interessierem, ob man hier noch etwas mehr Geschwindigkeit rausholen kann und wie.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929638</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Tue, 29 Nov 2005 12:49:14 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Tue, 29 Nov 2005 12:54:03 GMT]]></title><description><![CDATA[<p>du könntest die Zwischenvariablen weglassen und die ganzen Zwischenschritte zu einer Rechnung zusammenfassen:</p>
<pre><code class="language-cpp">return (slots+1)*((in - min) / (max - min));
</code></pre>
<p>Sonst sieht das in meinen Augen schon recht optimal aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929645</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 29 Nov 2005 12:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Tue, 29 Nov 2005 12:58:20 GMT]]></title><description><![CDATA[<p>Ok, danke.<br />
Ich dachte da evtl noch an den <strong>if</strong>-Block, aber da gibt es wohl eine Möglichkeit oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929651</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Tue, 29 Nov 2005 12:58:20 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Tue, 29 Nov 2005 13:02:39 GMT]]></title><description><![CDATA[<p>Du könntest den if() natürlich auch weglassen und stattdessen einen Kommentar &quot;das Verhalten ist undefiniert, wenn in außerhalb des Intervalls [min,max] liegt&quot; in die Dokumentation aufnehmen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/929658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929658</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 29 Nov 2005 13:02:39 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Tue, 29 Nov 2005 16:53:35 GMT]]></title><description><![CDATA[<p>daishi schrieb:</p>
<blockquote>
<p>Mich würde nun interessierem, ob man hier noch etwas mehr Geschwindigkeit rausholen kann und wie.</p>
</blockquote>
<p>Hallo Daishi,</p>
<p>Du kannst Berechnungen, die nicht mit jedem neuen Messwert gemacht werden vorher machen und das Zwischenergebnis abspeichern.<br />
Ich unterstelle mal, dass sich weder die Anzahl der slots noch das Intervall [min,max) ändert, während die Messwerte reinkommen.</p>
<p>Dann ist Dir mit dieser Klasse vielleicht geholfen</p>
<pre><code class="language-cpp">class Diskretisierer
{
public:
    Diskretisierer( int nSlots, double minVal, double maxVal )
        : m_nSlots( nSlots )
        , m_min( minVal )
        , m_max( maxVal )
        , m_b( (m_max - m_min) / m_nSlots )
    {}

    int idx( double x ) const
    {
        const int idx = int( (x - m_min) / m_b ); // s.Kommentar unten
        if( x &lt; m_min || idx &gt;= m_nSlots )
            return -1;
        return idx;
    }
private:
    int     m_nSlots;
    double  m_min;
    double  m_max;
    double  m_b;
};
</code></pre>
<p>Die Anwendung ist so ähnlich wie hier:</p>
<pre><code class="language-cpp">int main()
{
    using namespace std;
    Diskretisierer dis( 7, 5.0, 12.0 );
    for( double x = 4.6; x &lt; 13.0; x += 0.4 )
        cout &lt;&lt; x &lt;&lt; &quot; idx: &quot; &lt;&lt; dis.idx( x ) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>Der Wert 'm_b' wird nur einmal berechnet und entspricht Deinem 'b' in 'diskret'. Dann habe ich noch 'slots' maximaler Index durch 'bSlots' =Anzahl der Slots ersetzt - also nSlots = slots + 1.<br />
Weiter ist mir aufgefallen, dass das 'min' bei der Berechnung des slot-Indexes nicht berücksichtigt wird. Ich meine, dass Dein Prog nicht wie gewünscht funktioniert, falls 'min' einen Wert !=0 annimmt.</p>
<p>Die Abfrage</p>
<pre><code class="language-cpp">if( x &lt; m_min || idx &gt;= m_nSlots )
</code></pre>
<p>ist ernst gemeint. Ein</p>
<pre><code class="language-cpp">if( idx &lt; 0 || idx &gt;= m_nSlots )
</code></pre>
<p>liefert falsche Werte für ein 'x' knapp unterhalb von 'min', da z.B. int( -0.5 ) auch wieder 0 ist.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929948</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 29 Nov 2005 16:53:35 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Wed, 30 Nov 2005 08:57:29 GMT]]></title><description><![CDATA[<p>Danke erstmal an die beiden fleißigen Helfer.<br />
Die Idee mit der Klasse war echt klasse. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Bei der Performance konnte ich ca. 3% gut machen.</p>
<p>Ein Fehler ist mir noch aufgefallen, das <strong>+1</strong> bei slots muß weg.</p>
<p>Dann ist aber noch eine Sache, die ich nicht verstehe.</p>
<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Der Wert 'm_b' wird nur einmal berechnet und entspricht Deinem 'b' in 'diskret'. Dann habe ich noch 'slots' maximaler Index durch 'bSlots' =Anzahl der Slots ersetzt - also nSlots = slots + 1.<br />
Weiter ist mir aufgefallen, dass das 'min' bei der Berechnung des slot-Indexes nicht berücksichtigt wird. Ich meine, dass Dein Prog nicht wie gewünscht funktioniert, falls 'min' einen Wert !=0 annimmt.</p>
<p>Die Abfrage</p>
<pre><code class="language-cpp">if( x &lt; m_min || idx &gt;= m_nSlots )
</code></pre>
<p>ist ernst gemeint. Ein</p>
<pre><code class="language-cpp">if( idx &lt; 0 || idx &gt;= m_nSlots )
</code></pre>
<p>liefert falsche Werte für ein 'x' knapp unterhalb von 'min', da z.B. int( -0.5 ) auch wieder 0 ist.</p>
</blockquote>
<p>Ich habe deine Klasse und meine Funktion mal laufen lassen. Beide liefern die gleichen Ergebnisse und der von dir beschriebene Fehler tritt nicht auf.<br />
Deshalb hänge ich hier nochmal den voll kommentierten Quelltext rein.</p>
<pre><code class="language-cpp">int diskret(double in, double min, double max, int slots)
{
//in		Messwert
//min, max	Intervall
//slots		Maximaler Index 	
	if((in &gt;= min) &amp;&amp; (in &lt; max))	//Probe ob Wert im Intervall
	{
		double b = (max - min) / (slots);	//Groesse eines Slots im Wertebereich
		double tmp = in - min;	//Werte auf das Intervall [0..max-min) bringen
		tmp = tmp / b;	//Index ermitteln
		return int(tmp);
	}
	else
		return -1;	//in ausserhalb des Intervalles
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/930336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930336</guid><dc:creator><![CDATA[daishi]]></dc:creator><pubDate>Wed, 30 Nov 2005 08:57:29 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Wed, 30 Nov 2005 11:57:16 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Weiter ist mir aufgefallen, dass das 'min' bei der Berechnung des slot-Indexes nicht berücksichtigt wird. Ich meine, dass Dein Prog nicht wie gewünscht funktioniert, falls 'min' einen Wert !=0 annimmt.</p>
</blockquote>
<p>Guck doch mal ganz genau hin - min wird verwendet <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="😉"
    /> (besonders durlich siehst du das, wenn du meine zusammengekürzte Version betrachtest)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930475</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 30 Nov 2005 11:57:16 GMT</pubDate></item><item><title><![CDATA[Reply to Diskretisieren von Messwerten (optimieren) on Wed, 30 Nov 2005 12:50:21 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>min wird verwendet</p>
</blockquote>
<p>Stimmt - hast Recht! ich hatte mich vertan.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/930547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/930547</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 30 Nov 2005 12:50:21 GMT</pubDate></item></channel></rss>