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

for Schleife; Wert von i speichern

 

JJJ
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2008, 23:36     Titel: for Schleife; Wert von i speichern
  Antworten mit Zitat      
Liebes Matlab Forum


bin ein Anfänger und habe eine Anfängerfrage. Also ich beschäftige mich Wal- Sounds und importiere die wav.- Dateien(Y) in Matlab.
Danach setzte ich alle Werte eines bestimmten Wertebereichs mittels einer if- Funktion gleich null. Das imporierte Soundfile hat i- Werte. Nun würde ich gerne für den Fall, dass Y(i,:) ungleich null ist, den Wert von i in einem neuen Vektor abspeichern.
Zum Beispiel Y(1,:)-Y(1000,:)=0 und dann Y(1001,:) ungleich null, speichere 1001 in Vektor x usw. D.h. am Ende hätte ich gerne einen Vektor x mit Werten von i, an denen Y ungleich null ist.
Freue mich auf euere Tipps und Fragen, mal schauen wie schnell das hier geht!

Hier der bisherige Code:
Code:

FS=96000;
NBITS=32;
[Y,FS,NBITS]=wavread(Test_Data_2.2',[256 192000]);
   
for i=1:191745;
         if Y(i',:)<0.0015 & Y(i',:)>-0.0015;
            Y(i',:)=0;
         else
            strlen = 1600000;
            fid = fopen('x.bin','w');
            str = ? UND HIER BRÄUCHTE ICH EURE HILFE!
            fwrite(fid, str);
         end
end
fclose(fid)
 



Aloha Jakob
Private Nachricht senden Benutzer-Profile anzeigen


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 12.11.2008, 10:52     Titel:
  Antworten mit Zitat      
Hallo,
ganz genau habe ich die Frage nicht verstanden, da y(1,Smile ein Vektor ist... dieser kann mal 0 mal ungleich 0 sein.
Aber generell: find müsste helfen.
Code:
y = [2 0 3 4];
x = find(y~=0)
 

liefert für x: 1,3,4.

Außerdem: die if-Anweisung ist auch problematisch, da das Ergebnis der Vergleichsoperation ein Vektor ist (darf eigentlich nur Zahl). Meinst Du, dass alle Werte von y(:,i)<0.0015 sein sollen, damit alle zu 0 gesetzt werden? Dann würde ich das auch schreiben:
Code:
if all(abs(y(i,:)<0.0015))
y(i,:)=0;
else
...
 


Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2008, 12:25     Titel:
  Antworten mit Zitat      
Hallo,

da gibt es eigentlich mehrere Problematiken Smile

Ich würde es so machen:
Code:
FS = 96000;
NBITS = 32;
[Y, FS, NBITS] = wavread('Test_Data_2.2',[256 192000]);

% Indizes aller Elemente die größer, gleich 0.0015 sind
idx_nonzero = find(abs(Y)>=0.0015);
% speichern
save('x.bin','idx_nonzero','-ascii');


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 12.11.2008, 12:33     Titel:
  Antworten mit Zitat      
Hallo JJJ,

1. Willkommen im Forum, ich mache auch viel mit Tierlauten, würde gerne etwas genauer wissen was du in welchem Zusammenhang machst, kannst mir ja mal ne PN schicken.

2. Eigentlich brauchst du dafür keine If Schleifen, auch wenn dann Ansatz richtig war, da Y(i,Smile dir ja immer nur eine Zahl liefert wenn du einen Kanal benutzt. Am besten ist es immer if Schleifen zu vermeiden wenn es geht. Am besten wie Titus schon gesagt hat find benutzen also:

Code:

x=find(abs(Y)>0.15);
 


Damit hast du deinen Vektor x schonmal, danach mußt du diesen dann nurnoch als textdatei speichern, also so wie du das schon angefangen hast. Tipp: selbst wenn du die If Anweisung behalten würdest mache lieber immer vorher einen Vektor und dann in Datei speichern, sonst hast du ein extremes Laufzeitproblem.

3. Ausgabe in Datei geht vielleicht so besser:
Code:

fprintf(fid,'%d\r\n',x)
 


4. Benutze in Schleifen lieber nicht i, da es auch für die imaginäre Zahl steht.

Viel Erfolg noch,

der Oli

Edit: Jup oder so wie dibor Smile dabei drück ich schon immer F5 um zu sehen ob nicht schon jemand anderes gepostet hat. Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
JJJ
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 11.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2008, 00:32     Titel:
  Antworten mit Zitat      
Hallo


vielen, vieln Dank, das hilft mir wirklich weiter und geht dazu ja auch noch richtig schnell!!! Hab mich für die Lösung von dib0r entschieden, da sie sehr simpel wirkt.

Nun habe ich leider noch ein weiteres Problem: Die für x ermittelten Werte stellen die Anfangswerte für relevante Signale dar. Nun gibt es für den Vektor x natürlich Werte die unmittelbar aufeinander Folgen (weil ein Signal natürlich nicht aus einem Wert besteht). Z.B. für x [1700 1701 1703 1705 16498...] --> erstes Signal beginnt bei 1700, nächstes bei 16498, usw.

Nun möchte ich gerne alle Werte herausfiltern, die für dieses Beispiel zwischen 1700 und 1956 (1700+256; länge des jeweiligen Signals entspricht 256) liegen.
Mein Vektor nachher also x [1700 16498...] darstellt und mir so lediglich die Anfangswerte einer Funktion wieder gibt.

Dazu habe ich folgendes (sehr umständliches) Programm geschrieben:

Code:

for j=1:length(idx_nonzero)
    a=idx_nonzero(j',:);
    b=idx_nonzero(j'+1,:);
    if a + 256 > b
        idx_nonzero(abs(j'),:)=0
    end
end
idx_nonzero=idx_nonzero(idx_nonzero~=0)
 


Ich bekomme hierauf einige Vektoren als Lösung, wobei der letzte der gesuchte ist. Dann werden alle Nullen mittels der letzten Zeile gelöscht und ich habe die gesuchten Signalanfänge.
Ich bin mir sicher, dass einer von euch Profis dafür eine elegantere Lösung hat! Vielen Dank nochmals für euer schnelle, ausführliche und vorallem hilfreiche Hilfe.

Aloha Jakob
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 13.11.2008, 01:32     Titel:
  Antworten mit Zitat      
Hi Jakob,

das hier sollte funktionieren:

Code:

A=[1007;1008;1010;2000;2256;3000;3257];
B=A(2:end);
diff=B-A(1:end-1);
x=[true;(diff>256)];
A(x)
 


Muss gleich mal meinen Code checken, glaube hab das damals noch nicht so hinbekommen. Allerdings habe ich damals auch die Endpunkte bestimmt, brauchst du die nicht auch noch?

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2008, 13:19     Titel:
  Antworten mit Zitat      
Hallo,

ich befürchte das geht nicht ohne Schleife (man sollte in MATLAB Schleifen vermeiden - wegen der Geschwindigkeit).
Code:
N = 256;
idx_neu = idx_nonzero(1); % neues Array anlegen
for i=2:length(idx_nonzero)
  if idx_nonzero(i)-idx_neu(end)>=N % vergleichen ob zuletzt geschriebenes Element in idx_neu um N von aktuellem Element in idx_nonzero abweicht
     idx_neu(end+1) = idx_nonzero(i); % füge Element hinzu
  end
end

Ich weiss nicht ob dieser Code hier schneller ist, ich denke mal nicht wirklich:
Code:
N = 256;
csum = cumsum(diff(idx_nonzero)); % kumulative Summe über die Differenz des Vektors
idx_temp = find(csum>=N); % initialisierung
idx_neu = idx_nonzero(1);
while ~isempty(idx_temp)
  idx_neu(end+1) = idx_nonzero(idx_temp(1)+1); % zuweisung des gültigen Wertes
  csum = csum - csum(idx_temp(1)); % aktualisieren der Summe
  idx_temp = find(csum>=N); % überprüfung ob >N
end


Der Code von derOli funktioniert zwar auch (und ist sicherlich weitaus schneller), allerdings mit der Einschränkung, dass nur benachbarte Werte verglichen werden. z.B. für
Code:
liefert er nur 1 als Ergebnis (ich denke du willst da [1 257 513 769] als Ergebnis haben).

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
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.