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

Formatproblem mit uitable.Data

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.01.2016, 01:38     Titel: Formatproblem mit uitable.Data
  Antworten mit Zitat      
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:

Code:

figure(1)
x=1:10;
y=rand(10,1);
hline = plot(x,y,'b');
grid on;

axh = gca;

PeaksTableTest(axh, hline,  gobjects(0)) % nur 1 Signal für Max S1
 


Ich erhalte dann folgende Fehlermeldung

Zitat:

Error using uitable
While setting the 'Data' property of Table:
Data within a cell array must have size [1 1]

Error in uitable (line 51)
thandle = builtin('uitable', varargin{:});

Error in PeaksTableTest (line 69)
handles.PeaksTable = uitable(handles.MainWindow,'Data',PeaksVal,...

Error in test_peakstable (line 9)
PeaksTableTest(axh, hline, gobjects(0))


Hier meine GUI:

Code:

function [] = PeaksTableTest(axh, hLineMaxPeaksS, hLineMinPeaksS)

% GUI Color Codes
handles.Data.Color.BackgroundGrey = [38/255 38/255 38/255];
handles.Data.Color.FontColor = [1 1 1];

handles.MainWindow = figure(...
'PaperUnits','inches',...
'Units','normalized',...
'Position',[0 0 0.25 0.5],...
'Visible',get(0,'defaultfigureVisible'),...
'Color',get(0,'defaultfigureColor'),...
'CurrentAxesMode','manual',...
'IntegerHandle','off',...
'MenuBar','none',...
'Name','Tabelle Max-/MinPeaks',...
'NumberTitle','off',...
'Resize',get(0,'defaultfigureResize'),...
'ScreenPixelsPerInchMode','manual',...
'ChildrenMode','manual',...
'ParentMode','manual',...
'HandleVisibility','on',...
'Tag','SignalViewer',...
'Color',handles.Data.Color.BackgroundGrey,...
'CreateFcn', {@movegui,'northwest'});

% 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});
   
    if numel(hLineMaxPeaksS) == 2
        % MaxPeaks Signal 2
        PeaksInd{1,2} = get(hLineMaxPeaksS(2),'XData')';
        PeaksVal{1,2} = get(hLineMaxPeaksS(2),'YData')';
       
        NumPeaks = max([length(PeaksVal{1,1}) length(PeaksVal{1,2})]);
    end
end

if ~isempty(hLineMinPeaksS)
    % MinPeaks Signal 1
    PeaksInd{1,3} = get(hLineMinPeaksS(1),'XData')';
    PeaksVal{1,3} = get(hLineMinPeaksS(1),'YData')';
   
    NumPeaks = max([length(PeaksVal{1,1}) length(PeaksVal{1,2}) length(PeaksVal{1,3})]);
   
    if numel(hLineMaxPeaksS) == 2
        % MinPeaks Signal 2
        PeaksInd{1,4} = get(hLineMinPeaksS(2),'XData')';
        PeaksVal{1,4} = get(hLineMinPeaksS(2),'YData')';
       
        NumPeaks = max([length(PeaksVal{1,1}) length(PeaksVal{1,2}) length(PeaksVal{1,3}) length(PeaksVal{1,4})]);
    end
end

% Create the column and row names in cell arrays
cnames = {'Max S1','Max S2','Min S1','Min S2'};

rnames = cell(1,NumPeaks);

for i=1:NumPeaks
    rnames{1,i} = num2str(i,'%d');
end

% Create the uitable
handles.PeaksTable = uitable(handles.MainWindow,'Data',PeaksVal,...
                            'ColumnName',cnames,...
                            'RowName',rnames,...
                            'Units','normalized',...
                            'BackgroundColor',handles.Data.Color.BackgroundGrey,...
                            'ForegroundColor',handles.Data.Color.FontColor,...
                            'Position', [0 0 1 1],...
                            'CellSelectionCallback',{@SelectedPeak});
 
% UIWAIT makes GUI wait for user response (see UIRESUME)
uiwait(handles.MainWindow);
                       
                       
%% Callback

    function SelectedPeak(varargin)
        SelPeak = varargin{1,2}.Indices;
        % highlight selected Peak in table on extisting plot
        set(axh,'NextPlot','add')
        hLinePeak = plot(axh, PeaksInd{1,1}(SelPeak(1)), PeaksVal{1,1}(SelPeak(1)));    

        if SelPeak(2) < 3
            set(hLinePeak,'LineStyle','none',...
                'Marker','^',...
                'MarkerEdgeColor','r',...                          
                'MarkerSize',12,...
                'Visible','off');
        else
            set(hLinePeak,'LineStyle','none',...
                'Marker','v',...
                'MarkerEdgeColor','r',...                          
                'MarkerSize',12,...
                'Visible','off');
        end
       
%         annotation('textbox', [PeaksInd{1,1}(SelPeak), PeaksVal{1,1}(SelPeak),0.1,0.1],...
%            'String', {['x: ' num2str(PeaksInd{1,1}(SelPeak),'%f')],['y: ' num2str(PeaksVal{1,1}(SelPeak),'%f')]});
    end
end
 


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:

Code:

handles.PeaksTable = uitable(handles.MainWindow,'Data',PeaksVal{1},...                            
 


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!

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen


DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.01.2016, 09:10     Titel:
  Antworten mit Zitat      
Das plot Problem habe ich gelöst. Ich habe schlicht das Visible = off übersehen Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.01.2016, 11:35     Titel: Re: Formatproblem mit uitable.Data
  Antworten mit Zitat      
Hallo DSP,

Zitat:
Data within a cell array must have size [1 1]

Die Fehlermeldung ist eindeutig, oder? Offenbar ist ein oder mehrere Elemente des CELL-Arrays nicht skalar. Das ist aber erforderlich fürein uitable .

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.01.2016, 11:44     Titel:
  Antworten mit Zitat      
Hallo,

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

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 24.01.2016, 18:08     Titel:
  Antworten mit Zitat      
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.

Code:

PeaksVal = cell(1,4);

% 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});
   
    if numel(hLineMaxPeaksS) == 2
        % MaxPeaks Signal 2
        PeaksInd{1,2} = get(hLineMaxPeaksS(2),'XData')';
        PeaksVal{1,2} = get(hLineMaxPeaksS(2),'YData')';
       
        NumPeaks = max([NumPeaks length(PeaksVal{1,2})]);
    end
end

if ~isempty(hLineMinPeaksS)
    % MinPeaks Signal 1
    PeaksInd{1,3} = get(hLineMinPeaksS(1),'XData')';
    PeaksVal{1,3} = get(hLineMinPeaksS(1),'YData')';
   
    NumPeaks = max([NumPeaks length(PeaksVal{1,3})]);
   
    if numel(hLineMaxPeaksS) == 2
        % MinPeaks Signal 2
        PeaksInd{1,4} = get(hLineMinPeaksS(2),'XData')';
        PeaksVal{1,4} = get(hLineMinPeaksS(2),'YData')';
       
        NumPeaks = max([NumPeaks length(PeaksVal{1,4})]);
    end
end

Data = cell(NumPeaks,size(PeaksVal,2));

% 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
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.01.2016, 22:56     Titel:
  Antworten mit Zitat      
Hallo DSP,

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


Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.01.2016, 09:02     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für die Vereinfachung!

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 Wink

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.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.01.2016, 16:27     Titel:
  Antworten mit Zitat      
Hallo DSP,
Zitat:
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
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.