Verfasst am: 24.01.2016, 01:38
Titel: Formatproblem mit uitable.Data
Hallo goMatlab Forum,
ich plotte 1 oder 2 Signal mit x und y Werten, sowie wenn gewünscht und/oder die Min- und Maxpeaks der Signale. Nun sollen die Peaks in einer
uitable
aufgelistet werden. Das können dann jeweils 1,2 oder 4 Datenspalten sein.
Mein erstes Problem besteht beim Zuweisen der Daten, wobei ich die uitable GUI wie folgt an Hand eines kleinen Beispiels wie folgt aufrufe:
% get data of peaks if ~isempty(hLineMaxPeaksS) % MaxPeaks Signal 1
PeaksInd{1,1} = get(hLineMaxPeaksS(1),'XData')';
PeaksVal{1,1} = get(hLineMaxPeaksS(1),'YData')';
NumPeaks = length(PeaksVal{1,1});
Die Peakwerte eines Signals sind i.d.R. unterschiedlich in der Anzahl. Weshalb ich die einzlenen Datenarrays zusammen in eine Zelle packen muss.
Wenn ich hier nun explizit bei Data die 1. Zelle von PeaksVal aufrufe:
wird zumindest die Tabelle fehlerfrei erstellt. Allerdings funktioniert das plotten des einzlenen in der Tabelle selektierten Peaks nicht. Die Koordinaten stimmen zumindest. Aber in der Figur wird er nicht angezeigt.
Ich bin mir sicher jemand hier kennt eine Lösung. Vielen Dank vorab!
nimm es mir nicht übel JanS, aber der Post ist überflüssig denn er trägt nicht zu irgendeiner Lösung bei. Ich verstehe die Fehlermeldung sehr wohl und habe mir auch die Doku zum Befehl angesehen. Allerdings weiß ich dennoch nicht wie ich es umsetzen soll. Sonst hätte ich wohl nicht gefragt.
Wie muss ich denn Data übergeben, wenn ich z.B. für die 1. beiden Spalten einen Array mit [10x1] Peaks habe und einen [20x1] Peaks habe? Ich kann es so ja nur in ein cell packen, wenn ich nicht den 1. array auf die Größe von array 2 bringen möchte.
Ich habe das Problem mit den Tabellen Daten nun so gelöst, in dem ich einen cell Matrix erstelle und die Peakwerte in strings umwandel. Damit alle Spalten die gleiche Anzahl an Werten haben, wird durch Leerzeichen in der Zelle aufgefüllt.
% get data of peaks if ~isempty(hLineMaxPeaksS) % MaxPeaks Signal 1
PeaksInd{1,1} = get(hLineMaxPeaksS(1),'XData')';
PeaksVal{1,1} = get(hLineMaxPeaksS(1),'YData')';
NumPeaks = length(PeaksVal{1,1});
% create table data with peak values as string for i = 1:size(PeaksVal,2)
l = 1;
for k = 1:NumPeaks
if l <= size(PeaksVal{1,i},1)
Data{k,i} = num2str(PeaksVal{1,i}(l),'%.4f');
l = l + 1;
else
Data{k,i} = ''; % empty cell end end end
Kein Problem, es gäbe keinen Grund Dir hier etwas übel zu nehmen.
Die Schwierigkeit Deine Frage anders zu beantworten lag darin, dass noch nicht ersichtlich war, was Du genau darstellen willst. Zu wissen, dass ein Call-Array als Datennicht möglich ist, erlaubt noch nicht zu wissen, was Du damit erreichen möchtest. Das hattest Du aber erst auf meine Antwort hin erklärt. Insofern war es vielleicht doch nicht ganz so überflüssig.
Und wenn doch, so würde es mich nicht verblüffen, wenn ich die eine oder andere Frage einfach nicht richtig verstehe. Kann ja mal passieren.
Noch einen Vorschlag zur Code-Vereinfachung:
Code:
Data = cell(NumPeaks,size(PeaksVal,2));
Data(:) = {''};
% create table data with peak values as string for i = 1:size(PeaksVal,2)
c = sprintfc('%.4f', PeaksVal{1, i});
Data(1:numel(c), i) = c(:);
end
Sicherlich versteht man die Problemstellung nicht immer sofort. Geht mir oft genauso wenn ich selbst versuche zu helfen. Wenn ich hier aber doch mal eine eigene Frage habe, bemühe ich mich stets ein lauffähiges Bsp. zu posten. So auch hier. Wenn man den Code mit der angegebenen Änderung ausführt, wäre denke ich sofort klar gewesen, was ich erreichen möchte
Ich dachte eben es gäbe eine Möglichkeit das table ohne vorherige Umwandlung in strings zu laden. Aber offensichtlich geht das mit unterschiedlichen Anzahl an Elementen pro Spalte nicht.
Aber letztendlich soll mir auch diese Umsetzung recht sein. Hauptsache es funktioniert.
Wenn man den Code mit der angegebenen Änderung ausführt, wäre denke ich sofort klar gewesen, was ich erreichen möchte ;)
Das stimmt sicherlich. Leider habe ich tagsüber kein Matlab zur Verfügung, so dass ich den Code nicht laufen lassen kann.
Zitat:
Ich dachte eben es gäbe eine Möglichkeit das table ohne vorherige Umwandlung in strings zu laden. Aber offensichtlich geht das mit unterschiedlichen Anzahl an Elementen pro Spalte nicht.
Ja, das ungefähr war es, was ich mit meiner Antwort eigentlich ausdrücken wollte. Da war ich wohl nicht gut verständlich.
Viele Grüße, 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
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.