WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix effizient füllen und Werte abfragen

 

narf
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2008, 21:30     Titel: Matrix effizient füllen und Werte abfragen
  Antworten mit Zitat      
Hallo!

Ich hab die Aufgabe bekommen folgendes Problem zu lösen:

Zitat:
Zum Mähen einer kreisfö̈rmigen Rasenflä̈che soll ein Schaf eingesetzt werden. Das Schaf wird mit einer Schnur an einem Pfahl festgebunden, der am Rand der Wiese steht. Schreiben Sie ein MATLAB-Programm zur Berechnung, wie lang die Schnur sein muss, damit das Schaf die Hä̈lfte der Flä̈che der Wiese mähen kann!


Das hab ich so gelöst, dass ich eine Matrix mit den Abstandswerten vom Ausgangspunkt gefüllt habe und nacher gesucht habe, ab welchem Wert mind. 50% der Matrix vertreten sind.

Code:
size=[1000;500]   % größe der abfragematrix
schaf=[300;1]      % position des schafes

W=zeros(size(2,1),size(1,1));
for ix=1:size(1,1),
   for iy=1:size(2,1),
      W(iy,ix)=sqrt((ix-schaf(1,1))^2+(iy-schaf(2,1))^2); % r = sqrt ( (x-xm)^2 + (y-ym)^2 )
   end
end

for a=0:max(size),
   teil=sum(sum(W<=a));
   if (teil>=1/2*size(2,1)*size(1,1))
      printf('50%% oekogerecht gemaeht bei einer Schnurlaenge von %i Feldern', a-1);
      break;
   end
end


Das löst zwar das Problem, aber der Code ist äußerst ineffizient. Kann mir von euch einer sagen wie ich entweder das Füllen oder das Abfragen effizienter machen kann? - beim Abfragen hatte ich schon eine andere Möglichkeit (so dass sum nicht so oft angewandt wird), aber das war noch langsamer.
Private Nachricht senden Benutzer-Profile anzeigen


keloid
Forum-Century

Forum-Century


Beiträge: 216
Anmeldedatum: 04.10.07
Wohnort: ---
Version: 7.5.0.342 (R2007b)
     Beitrag Verfasst am: 03.04.2008, 07:53     Titel:
  Antworten mit Zitat      
Leider benutze ich mein Matlab gerade selbst, daher kann ich es nicht ausprobieren.

Es sollte aber folgendes funktionieren (zumindest für das erstellen der Matrix W):
Code:
groesse = [1000;500];
schaf = [300;1]

W = zeros(groesse(2,1),groesse(1,1));
ix = (1:groesse(1,1));
ix = repmat(ix,groesse(2,1),1); % erstelle eine Matrix der Groesse von W, deren Zeilen alle die Werte 1 bis groesse(2,1) enthalten
iy = (1:groesse(2,1))';
iy = repmat(iy,1,groesse(1,1)); % analog zu ix, nur wird die Matrix aus Aneinanderreihung der Spalten erzeugt

W = sqrt((ix-schaf(1,1)).^2 + (iy-schaf(2,1)).^2); % die Schafposition wird von den Indizes subtrahiert, danach werden die beiden Matrizen jeweils elementweise quadriert, die Matrizen werden addiert, und elementweise wird die Wurzel gezogen.


Ich habe mal die Variable size umbenannt, da es der Fehlersuche abträglich ist, wenn man Variablen den Namen von internen Funktionen gibt ;)

Für den zweiten Teil muss ich mir noch etwas überlegen.
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 03.04.2008, 10:24     Titel:
  Antworten mit Zitat      
Ich glaube für dieses Problem habe ich schon irgendwo eine analytische Lösung gesehen. Man musste nur ein (fieses?) Integral lösen...
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
narf
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.04.2008, 11:37     Titel:
  Antworten mit Zitat      
Danke, der Code funktioniert einwandfrei (und wirklich schnell verglichen zu meinem!)
repmat hab ich noch nie verwendet, aber damit scheint man Schleifen ja recht einfach umgehen zu können.

Und ich denk ich hab jetzt eine Idee wie ichs weiter optimieren kann, ich werds da posten sobald ich Zeit hab mich damit zu beschäftigen.

edit:
@nschlange: das Problem ließe sich sicher auch mit iterativen Integralen lösen, die dürften gar nicht mal so schwer sein... aber daran hab ich zuerst gar nicht gedacht, werd mir das am Wochenende mal genauer anschauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 03.04.2008, 12:33     Titel:
  Antworten mit Zitat      
Mit spaßiger Geometrie (Herleitung im Netz zu finden) kommt man auf
Code:
f=@(r) r^2*acos(r/2)+acos(1-r^2/2)-r*sqrt(1-r^2/4)-pi/2
fzero(f,1)


Edit:

Ich glaub, da war ich zu schnell. Das gilt für den Fall einer kreisförmigen Wiese.... Sad
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 03.04.2008, 19:12     Titel:
  Antworten mit Zitat      
Ich erinnere mich dunkel, zu Vordiplomszeiten mal einige Tage damit in der Mensa verbracht zu haben. Damals gab es noch kein google oder wiki, sondern altavista und Freunde. Wir haben uns damals darauf geeinigt, dass es analytisch nicht lösbar ist. Fall jemand eine Lösung findet, würde ich mich sehr freuen wenn mir jemand den Link schicken oder posten könnte!
_________________

---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 03.04.2008, 19:25     Titel:
  Antworten mit Zitat      
Zur Klarstellung: Ich weiß nicht mehr, ob es eine geschlossene Lösung gab/gibt. Vermutlich eher nicht, sonst hätte das Netz sie wohl ausgespuckt. Die Lösung mit den Integralen hab ich noch nicht gefunden, die war in irgendeinem Rätselbuch, glaub ich...
Ein Link
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2008, 11:04     Titel:
  Antworten mit Zitat      
Das fertige, optimierte Programm sah dann so aus (nicht ausprobiert, nur aus dem Gedächtnis noch mal runtergeschrieben):

Code:
groesse = [1000;500];
schaf = [300;1]

ix = repmat(1:groesse(1,1),groesse(2,1),1);
iy = repmat((1:groesse(2,1))',1,groesse(1,1));
W = (ix-schaf(1,1)).^2 + (iy-schaf(2,1)).^2; % wurzel kann man weglassen

W=sort(reshape(W,1,[]));
printf('Halbe Wiese oekogerecht gemaeht bei einer Schnurlaenge von %i Feldern', W(1,groesse(1,1)*groesse(2,1)/2));

Das ganze ließe sich also auch in 2 Zeilen lösen Wink

Analytische Lösung hab ich keine gefunden, aber auch nicht sehr lang daran herumprobiert.
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.