<?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ächsten Wert aus Tabelle suchen]]></title><description><![CDATA[<p>Servus,<br />
ich habe eine Tabelle mit Messwerten, welche ich nicht sortieren darf.<br />
Eon -&gt; f(U,I,T)<br />
Jetzt versuche ich bei einem bestimmten Arbeitspunkt, den nächstliegenden Wert aus der Tabelle auszulesen. Das funktioniert aber nicht wirklich.</p>
<pre><code class="language-cpp">int CSVInterface::FindTransferCharacter(int size, double* aT,double* aU,double* aI,double dT,double dU,double dI) {
	// double* T - Array Temperatur
	// double* U - Array Spannung
	// double* I - Array Strom
	// double T - Arbeitspunkt Temperatur
	// double U - Arbeitspunkt Spannung
	// double I - Arbeitspunkt Strom
	int i;
	int n1=0;

	double F1,F2;
	vector&lt;double&gt; dF;
	dF.resize(size,0);

	for(i=0;aT[i]!=0;i++) {
		if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dU-aU[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			return i;
		}
		else if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dU-aU[i]) == 0)) {
			F1 = (dI-aI[i]);
			F2 = (dI-aI[n1]);
		}
		else if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			F1 = (dU-aU[i]);
			F2 = (dU-aU[n1]);
		}
		else if((abs(dU-aU[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			F1 = (dT-aT[i]);
			F2 = (aT[n1]);
		}
		else if(abs(dT-aT[i]) == 0) {
			F1 = (dU-aU[i]) * (dI-aI[i]);
			F2 = (dU-aU[n1]) * (dI-aI[n1]);
		}
		else if(abs(dU-aU[i]) == 0) {
			F1 = (dT-aT[i]) * (dI-aI[i]);
			F2 = (dT-aT[n1]) * (dI-aI[n1]);		
		}
		else if(abs(dI-aI[i]) == 0) {
			F1 = (dT-aT[i]) * (dU-aU[i]);
			F2 = (dT-aT[n1]) * (dU-aU[n1]);
		}
		else {		
			F1 = (dT-aT[i]) * (dU-aU[i]) * (dI-aI[i]);
			F2 = (dT-aT[n1]) * (dU-aU[n1]) * (dI-aI[n1]);
		} // if

                  if(dF[i] &lt; dF[n1]) n1 = i;
		if(i==0) dF[i] = F1;
		else dF[i] = abs(abs(F1) - abs(F2));		
	} // for

	n1=0;
	for(i=0;aT[i]!=0;i++) {
		cout &lt;&lt; dF[i] &lt;&lt; endl;		
	}

	cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; n1 &lt;&lt; &quot;\t&quot; &lt;&lt; dF[n1] &lt;&lt; endl;
	return n1;
}
</code></pre>
<p>Was ich hier tu ist:<br />
1. Eine Raum, Fläche, Länge errechnen durch die Entfernung des Parameter und der Tabellenwerte<br />
F1 = (dT-aT[i]) * (dU-aU[i]) * (dI-aI[i]);<br />
F2 = (dT-aT[n1]) * (dU-aU[n1]) * (dI-aI[n1]);<br />
2. Der kleinste Raum(Fläche,Länge) gibt das nächstliegende Wertepaar an.<br />
Es liefert aber nicht die richtigen Werte!</p>
<p>Gibt es eine andere Möglichkeit dieses Ziel zu erreichen. Wie wird das bei LookUp Tabellen gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/181500/nächsten-wert-aus-tabelle-suchen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 10:10:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/181500.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 May 2007 13:25:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Nächsten Wert aus Tabelle suchen on Mon, 14 May 2007 13:25:42 GMT]]></title><description><![CDATA[<p>Servus,<br />
ich habe eine Tabelle mit Messwerten, welche ich nicht sortieren darf.<br />
Eon -&gt; f(U,I,T)<br />
Jetzt versuche ich bei einem bestimmten Arbeitspunkt, den nächstliegenden Wert aus der Tabelle auszulesen. Das funktioniert aber nicht wirklich.</p>
<pre><code class="language-cpp">int CSVInterface::FindTransferCharacter(int size, double* aT,double* aU,double* aI,double dT,double dU,double dI) {
	// double* T - Array Temperatur
	// double* U - Array Spannung
	// double* I - Array Strom
	// double T - Arbeitspunkt Temperatur
	// double U - Arbeitspunkt Spannung
	// double I - Arbeitspunkt Strom
	int i;
	int n1=0;

	double F1,F2;
	vector&lt;double&gt; dF;
	dF.resize(size,0);

	for(i=0;aT[i]!=0;i++) {
		if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dU-aU[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			return i;
		}
		else if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dU-aU[i]) == 0)) {
			F1 = (dI-aI[i]);
			F2 = (dI-aI[n1]);
		}
		else if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			F1 = (dU-aU[i]);
			F2 = (dU-aU[n1]);
		}
		else if((abs(dU-aU[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {
			F1 = (dT-aT[i]);
			F2 = (aT[n1]);
		}
		else if(abs(dT-aT[i]) == 0) {
			F1 = (dU-aU[i]) * (dI-aI[i]);
			F2 = (dU-aU[n1]) * (dI-aI[n1]);
		}
		else if(abs(dU-aU[i]) == 0) {
			F1 = (dT-aT[i]) * (dI-aI[i]);
			F2 = (dT-aT[n1]) * (dI-aI[n1]);		
		}
		else if(abs(dI-aI[i]) == 0) {
			F1 = (dT-aT[i]) * (dU-aU[i]);
			F2 = (dT-aT[n1]) * (dU-aU[n1]);
		}
		else {		
			F1 = (dT-aT[i]) * (dU-aU[i]) * (dI-aI[i]);
			F2 = (dT-aT[n1]) * (dU-aU[n1]) * (dI-aI[n1]);
		} // if

                  if(dF[i] &lt; dF[n1]) n1 = i;
		if(i==0) dF[i] = F1;
		else dF[i] = abs(abs(F1) - abs(F2));		
	} // for

	n1=0;
	for(i=0;aT[i]!=0;i++) {
		cout &lt;&lt; dF[i] &lt;&lt; endl;		
	}

	cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; n1 &lt;&lt; &quot;\t&quot; &lt;&lt; dF[n1] &lt;&lt; endl;
	return n1;
}
</code></pre>
<p>Was ich hier tu ist:<br />
1. Eine Raum, Fläche, Länge errechnen durch die Entfernung des Parameter und der Tabellenwerte<br />
F1 = (dT-aT[i]) * (dU-aU[i]) * (dI-aI[i]);<br />
F2 = (dT-aT[n1]) * (dU-aU[n1]) * (dI-aI[n1]);<br />
2. Der kleinste Raum(Fläche,Länge) gibt das nächstliegende Wertepaar an.<br />
Es liefert aber nicht die richtigen Werte!</p>
<p>Gibt es eine andere Möglichkeit dieses Ziel zu erreichen. Wie wird das bei LookUp Tabellen gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1284657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1284657</guid><dc:creator><![CDATA[etsmart]]></dc:creator><pubDate>Mon, 14 May 2007 13:25:42 GMT</pubDate></item><item><title><![CDATA[Reply to Nächsten Wert aus Tabelle suchen on Mon, 14 May 2007 21:55:51 GMT]]></title><description><![CDATA[<p>hi,<br />
Verständnisfrage zu:</p>
<blockquote>
<p>for(i=0;aT[i]!=0;i++) {<br />
if((abs(dT-aT[i]) == 0) &amp;&amp; (abs(dU-aU[i]) == 0) &amp;&amp; (abs(dI-aI[i]) == 0)) {<br />
return i;</p>
</blockquote>
<p>Diese if ist nur dann erfüllt, wenn das Tripel (dT, dU, dI) auch tatsächlich in den Vektoren aT etc enthalten ist. Dasselbe gilt für die anderen if's. Trifft das zu?</p>
<p>Zum Verständis deines Problems könnte auch ein kleines Zahlenbeispiel, was du hier einstelltst, beitragen<br />
Grüsse von Ney</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285001</guid><dc:creator><![CDATA[nexperty]]></dc:creator><pubDate>Mon, 14 May 2007 21:55:51 GMT</pubDate></item><item><title><![CDATA[Reply to Nächsten Wert aus Tabelle suchen on Tue, 15 May 2007 06:18:35 GMT]]></title><description><![CDATA[<p>Stimmt.<br />
Zuerst wird überprüft, ob der Arbeitspunkt mit den Tabellenwerten übereinstimmt. Das mach ich für drei, zwei und einen Wert.<br />
Ohne diese Abfrage würde z.B. (dT-aT[i]) zu Null werden und deshalb<br />
F1 = (dT-aT[i]) * (dU-aU[i]) * (dI-aI[i]) zu Null.</p>
<p>Was nicht funktioniert, ist das bei der Suche oft ein falscher Messwert zurückgegeben wird.</p>
<p>Ich versuche halt den Messwert zu finden, der die geringste Abweichung zu dem Arbeitspunkt hat. Bei der Suche müssten sich der zweit und drittnächste Punkt ergeben, damit ich daraus eine Kurve interpolieren und auch extrapolieren kann.</p>
<p>Mathematisch hab ich da keine Probleme mit, aber ich hänge ja schon beim Programmieren, wenn es um die Messwerte finden geht. Gibt es denn kein schlaues Verfahren was mir nicht bekannt ist. Ich habe leider nichts genaues über das Thema LookUpTable gefunden. Aber das scheint mir das richtige zu sein. Zumindest muss man da auch den nächstliegenden Punkt aus einer Tabelle bestimmen können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285049</guid><dc:creator><![CDATA[etsmart]]></dc:creator><pubDate>Tue, 15 May 2007 06:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to Nächsten Wert aus Tabelle suchen on Tue, 15 May 2007 21:12:22 GMT]]></title><description><![CDATA[<p>etsmart schrieb:</p>
<blockquote>
<p>Mathematisch hab ich da keine Probleme mit, aber ich hänge ja schon beim Programmieren, wenn es um die Messwerte finden geht. Gibt es denn kein schlaues Verfahren was mir nicht bekannt ist. Ich habe leider nichts genaues über das Thema LookUpTable gefunden. Aber das scheint mir das richtige zu sein. Zumindest muss man da auch den nächstliegenden Punkt aus einer Tabelle bestimmen können.</p>
</blockquote>
<p>Um den nächstliegenden Punkt zu finden, musst Du alle Punkte abfragen und bewerten, zumal sie nach Deiner Aussage nicht sortiert sind. Eine andere Möglichkeit gibt es nicht.</p>
<p>etsmart schrieb:</p>
<blockquote>
<p>Was nicht funktioniert, ist das bei der Suche oft ein falscher Messwert zurückgegeben wird.</p>
</blockquote>
<p>Ein Zahlenbeispiel wäre hilfreich. Obwohl ich meine, dass es an Deiner Methode liegt, den 'Raum' zu bestimmen. Mal angenommen, Du hast zwei Punkte<br />
1.) T=23C U=220V I=50mA=0.05A<br />
2.) T=23C U=300V I=60mA=0.06A<br />
weiter hast Du einen Wert sagen wir mal bei<br />
T=23C U=221V I=0.05A<br />
dieser liegt doch wohl 'näher' an 1.) als an 2.), aber Deine Raum-Berechnung ergibt:<br />
1.) |220-221| = 1 T und I sind gleich, werden also nicht berücksichtigt und<br />
2.) |300-221| * |0.06-0.05| = 0.79<br />
also ist der Raum bei 2.) kleiner als bei 1.), was aber offensichtlich falsch ist.</p>
<p>Ich würde Dir vorschlagen, die Werte für T, U und I auf einen sinnvollen Bereich zu normieren, so dass die einzelnen Werte immer im Bereich von 0 bis 1 liegen und dann die Quadratsumme dieser normierten Werte zu bestimmen.</p>
<p>In C++ gibt es für eine solche Suche den Algorithmus min_element, der aber mit einem Iterator-Paar arbeitet. Du hast als Input aber drei (Paare) von Iteratoren bzw. Pointern. Wenn Du die Messwerte in eine Struktur (z.B. TUI) zusammenfasst, so könnte der Code so aussehen:</p>
<pre><code class="language-cpp">int /*CSVInterface::*/FindTransferCharacter( int size, TUI* aTUI, TUI dTUI ) 
{
    return std::min_element( aTUI, aTUI + size, LessEON( dTUI ) ) - aTUI;
}
</code></pre>
<p>LessEON ist ein Funktor, der zwei Mess-(TUI-)Werte vergleicht; etwa so</p>
<pre><code class="language-cpp">class LessEON
{
public:
    explicit LessEON( const TUI&amp; tui )
        : m_ref( tui )
    {}
    // -- liefert 'true' falls a näher an m_ref liegt, als b
    bool operator()( const TUI&amp; a, const TUI&amp; b ) const
    {
        return abstand( a - m_ref ) &lt; abstand( b - m_ref );
    }
private:
    TUI m_ref;
};
</code></pre>
<p>so und jetzt fehlt nur noch die TUI-Struktur, mit der man rechnen kann</p>
<pre><code class="language-cpp">struct TUI // Tripel Temperatur, Spannung, Strom
{
    TUI( double t, double u, double i )
        : m_T( t ), m_U( u ), m_I( i )
    {}
    TUI operator-( const TUI&amp; b ) const
    {
        return TUI( m_T - b.m_T, m_U - b.m_U, m_I - b.m_I );
    }
    friend double abstand( const TUI&amp; tui )
    {
        // das wäre der Raum-Algorithmus ..
        if( tui.m_T == 0.0 &amp;&amp; tui.m_U == 0.0 &amp;&amp; tui.m_I == 0.0 )
            return 0.0;

        double erg = 1.0;       
        if( tui.m_T != 0.0 ) erg *= std::abs( tui.m_T );
        if( tui.m_U != 0.0 ) erg *= std::abs( tui.m_U );
        if( tui.m_I != 0.0 ) erg *= std::abs( tui.m_I );
        return erg;
    }
private:
    double m_T, m_U, m_I;
};
</code></pre>
<p>alternativ dazu - normierte Werte in TUI vorausgesetzt</p>
<pre><code class="language-cpp">friend double abstand( const TUI&amp; tui )
    {
        return tui.m_T * tui.m_T + tui.m_U * tui.m_U + tui.m_I * tui.m_I;
    }
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1285804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1285804</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 15 May 2007 21:12:22 GMT</pubDate></item></channel></rss>