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

Mittelwert zur Signalerzeugung

 

funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 13:14     Titel: Mittelwert zur Signalerzeugung
  Antworten mit Zitat      
Moin,

ich versuche aus einem array alle zehn Werte (hier Variable "vor") den Mittelwert zu bilden. Sind die Werte des array kleiner als der Mittelwert, soll "1" in einen array (signal) geschrieben werden, sind sie größer eine "0".
Trotz tausend mal drübergucken, finde ich den Fehler nicht...
Mittelwertbildung funktioniert, aber der Signalarray nicht.

Code:

preis = xlsread('preis.xlsx');
preis = preis';

for x = 1:168/vor
    sum = 0;
    for y = 1:vor
        z = y+((x-1)*vor);      %z = aktueller schritt
        sum = sum + preis(z);
    end
    mittel(z)= (sum/vor);
      if preis(z) < mittel(vor+((x-1)*vor))
          signal(z) = 1;
      else
           signal(z) = 0;
      end
end
 


Vielen Dank schonmal, falls sich jemand die Zeit nimmt Smile


DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.08.2012, 13:39     Titel:
  Antworten mit Zitat      
Eigentlich geht das doch viel einfacher...

Code:

x = rand(10,1); % Testvektor mit 10 Werten
mw = mean(x); % Mittelwert von x
y = x < mw;
% trifft die Bedingung x < mw zu = "true" wird eine 1 in y geschrieben, trifft sie nicht zu, wird eine Null in y geschrieben
 
Private Nachricht senden Benutzer-Profile anzeigen
 
funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 13:46     Titel:
  Antworten mit Zitat      
Danke für die schnelle Antwort.

Was vielleicht nicht richtig rüberkam:
Der array hat in meinem fall 168 einträge.
alle zehn werte soll der mittelwert gebildet werden. dann für die nächsten zehn werte, etc... Smile

Ach ja, im Beispiel oben ist

Code:
 
funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 13:53     Titel:
  Antworten mit Zitat      
Sorry, meinte

Code:

vor = 10;
 
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.08.2012, 14:12     Titel:
  Antworten mit Zitat      
sum als Variablenname ist übrigens keine gute Idee, da dies eine Matlab Funktion ist. Das führt nur zu Fehlermeldungen...

Code:

x = rand(168,1); % Testvektor
% Umordnung in 10 Pakete, da 168 nicht durch 10 teilbar, werden 2 NAN an x angehängt.
y=reshape([x;nan;nan],10,17);
% NAN werden bei Mittelwert nicht berücksichtigt
mw = nanmean(y); %  Mittelwert über jede Spalte von y -> 17 MW
w = zeros(10,17);
for i=1:length(mw)
     w(:,i) = y(:,i) < mw(i);
end
w(end-1:end) = []; % letzten beiden Werte wieder abschneiden
% wieder in Vektor wandeln
ergebnis = reshape(w,[],1);
 


Evtl. kann man das auch ohne die Schleife umsetzen...
Private Nachricht senden Benutzer-Profile anzeigen
 
funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 14:50     Titel:
  Antworten mit Zitat      
Vielen Dank DSP!
Das funktioniert Very Happy
Hat zwar etwas gedauert, aber ich konnte es nachvollziehen.

Jetzt besteht lediglich noch das die Herausforderung, dass ich:

1. den Testvektor (bei mir: preis)
2. das Intervall, im welchem der Mittelwert gebildet werden soll (vor)

VARIABEL gestalten will.

Beispielsweise ein Testvektor mit 734 (statt 168) Werten, in dem alle 13 (statt 10) Werte der Mittelwert gebildet werden soll, welcher dann wieder verglichen wird. Dann kann ich ja z.B. bei reshape nicht einfach ein NaN einfügen.

Mein Versuch sieht aus wie folgt: (funktioniert natürlich nicht Cool )

Code:

vor = 13;
preis = rand(734,1);

spalten = floor(length(preis)/vor);
preismatrix = reshape([preis;nan],vor,spalten);
mw = nanmean(preismatrix);
matrix = zeros(vor,length(preis)/vor);
for i=1:length(mw)
     matrix(:,i) = preismatrix(:,i) < mw(i);
end
matrix(end-1:end) = [];
ergebnis = reshape(matrix,[],1);
 
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.08.2012, 15:14     Titel:
  Antworten mit Zitat      
Ich würde das als Funktion definieren...

Code:

function ergebnis = myfun(preis,vor)

preis = preis(:); % Spaltenvektor
% Restdivision
rest = mod(length(preis),vor);
% nan anfügen
signal = [preis;nan(vor-rest,1)];
preismatrix = reshape(signal,vor,[]);
mw = nanmean(preismatrix);
[row,col] = size(preismatrix)
matrix = zeros(row,col);
for i=1:length(mw)
     matrix(:,i) = preismatrix(:,i) < mw(i);
end
matrix(length(preis)+1:end) = [];
ergebnis = reshape(matrix,[],1);

 
Private Nachricht senden Benutzer-Profile anzeigen
 
funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.08.2012, 16:45     Titel:
  Antworten mit Zitat      
Super, das funktioniert einwandfrei! Tausend Dank!

Da wäre ich im Leben nicht drauf gekommen. Aber zumindest verstehe ich die Lösung Smile

Rein interessenhalber: wieso funktioniert das Ganze nicht mit z.B. nanmin, statt nanmean? Der Rest des codes müsste ja unverändert bleiben...
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 07.08.2012, 16:57     Titel:
  Antworten mit Zitat      
Was soll denn hier nanmin? Diese Funktion gibt doch das Minimum eines Vektors aus, ohne nan zu berücksichtigen.

Die Funktion myfun liefert dann zwar schon ein Ergebnis, da aber kein Wert kleiner min ist, ist die Bedingung immer false, also wird eine Null geschrieben.
Private Nachricht senden Benutzer-Profile anzeigen
 
funk0r

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.08.2012, 09:17     Titel:
  Antworten mit Zitat      
Ja, danke.
Ist mir auch aufgefallen, als ich den code nochmal gaaaaanz langsam durchgegangen bin Smile
 
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 - 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.