<?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[Funktion an Funktion mit teilweise festen, teilweise variablen Parametern übergeben]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte mal fragen, wie man am besten ein Interface für eine Mathematische Optimierungs-Funktion gestaltet. Ich habe also eine Funktion, die eine andere Funktion minimiert, zum Beispiel Gradientenabstieg. Jetzt will ich an diese Funktion eine (fast) beliebige Funktion übergeben, die minimiert werden soll.</p>
<p>Die Anforderungen an diese Funktion sollen sein: Rückgabewert vom typ double, Erster Parameter vom typ std::vector&lt;double&gt;. Darüber hinaus soll die zu minimierende Funktion aber auch noch beliebige weitere Parameter aufnehmen können. Das Ganze habe ich momentan so realisiert:</p>
<pre><code>namespace fmin
{
	template &lt;typename T&gt;
	std::vector&lt;double&gt; gradient_decent(std::function&lt;double(std::vector&lt;double&gt; const &amp;, T const &amp;)&gt;, std::vector&lt;double&gt; const &amp; start_value_, T const &amp;optional_paras_);
}

double cost_function(std::vector&lt;double&gt; const &amp;paras, int myint)
{
	return paras.size() + myint; // Nur ein Beispiel
}

int _tmain(int argc, _TCHAR* argv[])
{

	std::vector&lt;double&gt; start_values{ 1 };
	int optional_paras = 1;

	fmin::gradient_decent&lt;int&gt;(cost_function, start_values, optional_paras);
}
</code></pre>
<p>Das kommt schon ganz gut an das hin was ich will, ist aber noch nicht perfekt... Mich nervt zum Beispiel dass man in der Zeile 18 den Template-Parameter mit übergeben muss. Kann man dem Compiler nicht sagen dass er sich diesen aufgrund der übergebenen Kostenfunktion selbst raussucht?</p>
<p>In Matlab kann man ja sowas machen:</p>
<p><code>fminsearch(@(x)cost_function(x, optional_paras), start_values);</code></p>
<p>Das heißt, cost_function wird <em>über x</em> minimiert. Die optionalen Parameter bleiben unverändert. Kann man in C++ etwas vergleichbar einfaches für den Anwender machen? Oder wie würdet ihr so ein Interface gestalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325386/funktion-an-funktion-mit-teilweise-festen-teilweise-variablen-parametern-übergeben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 14:44:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325386.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Apr 2014 08:46:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion an Funktion mit teilweise festen, teilweise variablen Parametern übergeben on Tue, 29 Apr 2014 08:46:24 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich wollte mal fragen, wie man am besten ein Interface für eine Mathematische Optimierungs-Funktion gestaltet. Ich habe also eine Funktion, die eine andere Funktion minimiert, zum Beispiel Gradientenabstieg. Jetzt will ich an diese Funktion eine (fast) beliebige Funktion übergeben, die minimiert werden soll.</p>
<p>Die Anforderungen an diese Funktion sollen sein: Rückgabewert vom typ double, Erster Parameter vom typ std::vector&lt;double&gt;. Darüber hinaus soll die zu minimierende Funktion aber auch noch beliebige weitere Parameter aufnehmen können. Das Ganze habe ich momentan so realisiert:</p>
<pre><code>namespace fmin
{
	template &lt;typename T&gt;
	std::vector&lt;double&gt; gradient_decent(std::function&lt;double(std::vector&lt;double&gt; const &amp;, T const &amp;)&gt;, std::vector&lt;double&gt; const &amp; start_value_, T const &amp;optional_paras_);
}

double cost_function(std::vector&lt;double&gt; const &amp;paras, int myint)
{
	return paras.size() + myint; // Nur ein Beispiel
}

int _tmain(int argc, _TCHAR* argv[])
{

	std::vector&lt;double&gt; start_values{ 1 };
	int optional_paras = 1;

	fmin::gradient_decent&lt;int&gt;(cost_function, start_values, optional_paras);
}
</code></pre>
<p>Das kommt schon ganz gut an das hin was ich will, ist aber noch nicht perfekt... Mich nervt zum Beispiel dass man in der Zeile 18 den Template-Parameter mit übergeben muss. Kann man dem Compiler nicht sagen dass er sich diesen aufgrund der übergebenen Kostenfunktion selbst raussucht?</p>
<p>In Matlab kann man ja sowas machen:</p>
<p><code>fminsearch(@(x)cost_function(x, optional_paras), start_values);</code></p>
<p>Das heißt, cost_function wird <em>über x</em> minimiert. Die optionalen Parameter bleiben unverändert. Kann man in C++ etwas vergleichbar einfaches für den Anwender machen? Oder wie würdet ihr so ein Interface gestalten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396744</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion an Funktion mit teilweise festen, teilweise variablen Parametern übergeben on Tue, 29 Apr 2014 08:54:42 GMT]]></title><description><![CDATA[<p>Das &lt;int&gt; sollte überflüssig sein.<br />
Ich würde keine optionalen Parameter angeben lassen. Mal sind sie nutzlos, dann zu wenig. Außerdem kann deine Minimierungsfunktion den optionalen Parameter eh nicht benutzen. Also nur std::function&lt;double(std::vector&lt;double&gt; const &amp;)&gt;. Sollte die Signatur mal nicht passen, dann kann man per Lambda oder std::bind die Signatur passen machen und damit mehr Parameter übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396748</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 29 Apr 2014 08:54:42 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion an Funktion mit teilweise festen, teilweise variablen Parametern übergeben on Tue, 29 Apr 2014 09:25:37 GMT]]></title><description><![CDATA[<p>Hm stimmt, du hast recht.</p>
<p>Ich muss mir echt mal angewöhnen mehr mit lambdas zu machen, vielen Danke für den Hinweis <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2396750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2396750</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Tue, 29 Apr 2014 09:25:37 GMT</pubDate></item></channel></rss>