|
|
Abbilden/Zuweisen von Vektoren unterschiedlicher Größe |
|
pooz |

Forum-Anfänger
|
 |
Beiträge: 49
|
 |
|
 |
Anmeldedatum: 04.05.09
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 19:09
Titel: Abbilden/Zuweisen von Vektoren unterschiedlicher Größe
|
 |
Hallo,
mein Problem ist sehr einfach. Es ist allerdings etwas schwierig in Worte zu fassen. Ich probiere es:
Ich habe 2 Vektoren unterschiedlicher Größe.
Vektor a ist M lang und enthält Werte im Bereich 1:N.
Vektor b ist N lang und enthält ausschließlich binäre Daten (true/false).
Jetzt möchte ich jene Indizes von a bekommen, bei denen im Intervall a-Toleranz bis a+Toleranz der Vektor b mindestens ein True enthält.
Begründung:
Bereich -1:5 ist in b keine 1 vorhanden.
Bereich 2:8 ist mind. eine 1 vorhanden.
Bereich 6:14 ist mind. eine 1 vorhanden.
Bereich 14:16 ist mind. eine 1 vorhanden.
Problem: Der Bereich kann auch negative Grenzen haben (siehe 1. Bereich)
Das ganze möglichst ohne Schleife, da es ressourcenschonend sein soll (der Code wird später nach C++ portiert für eine Echtzeitanwendung)
Ich hoffe, es kann mir jemand helfen.
Vielen Dank und viele Grüße
|
|
|
|
|
denny |

Supporter
|
 |
Beiträge: 3.853
|
 |
|
 |
Anmeldedatum: 14.02.08
|
 |
|
 |
Wohnort: Ulm
|
 |
|
 |
Version: R2012b
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 19:40
Titel:
|
 |
Hallo,
zumindest eine Schleife wird hier nötig sein:
|
|
|
pooz |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 49
|
 |
|
 |
Anmeldedatum: 04.05.09
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 20:13
Titel:
|
 |
Hi denny,
vielen Dank.
Deine Lösung scheint schneller als meine zu sein:
Was ich mich immer gefragt habe, ist, ob man die Abfrage an b, in deinem Fall mittels "any" , nicht einmalig, also vektorbasiert machen kann? D.h. alle Intervalle werden auf einmal abgefragt.
(Siehe meine untere Frage hier, auf die noch keine Antwort kam )
Dann könnte die Schleife auch noch eliminiert werden.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 22:32
Titel:
|
 |
Hallo Denny,
Vielleicht ist es schneller, auch den MIN/MAX Teil aus der Schleife zu ziehen:
Wenn es aber nach C++ portiert werden soll, ist es nicht notwendig, es möglichst schnell in Matlab laufen zu lassen, oder???
Gruß Jan
|
|
|
pooz |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 49
|
 |
|
 |
Anmeldedatum: 04.05.09
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 22:43
Titel:
|
 |
Hi Jan,
vielen Dank.
Naja, ich dachte, ich programmiere es schon von vornherein so optimal, wie es geht. Dann fällt die Portierung auch leichter, und man muss nicht alles von vorn überlegen
Aber es sieht schon alles mit eurer Hilfe ganz gut aus.
Gänzlich die Schleife vermeiden lässt sich nicht? Siehe link.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 09.08.2010, 23:51
Titel:
|
 |
Hallo Pooz,
ein in Matlab effizientes Programm ist im Allgemeinen nach einer direkten Protierung nach C++ nicht effizient - und umgekehrt.
Deshalb muss man eigentlich für eine Portierung die ganze Optimierei noch mal von vorne starten.
Während in Matlab Vektorisierung oft starke Vorteile bringt, ist in C im Allg. das Gegenteil der Fall, da dabei unnötige temporäre Arrays erzeugt werden.
Noch eine Idee die Schleife zu vermeiden: Wenn Tol riesig ist, ist es aufwändig den temporären Vektor "b(s(k):e(k))" zu erstellen. Falls alle Zahlen in diesem Vektor 0 sind, ist auch der erste und letzte Wert von "CUMSUM(b(s(k):e(k)))" gleich.
Leider läuft CUMSUM nicht für UINT32 in Matlab 2009b. Wenn Du weniger als 2^32 oder 2^16 Einsen hast, wäre es eine gute Idee, ein eigenes CUMSUM als Mex zu schreiben.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|