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

varargout-Fehler bei eigener Funktion

 

Slamdunker23
Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 27.06.2013, 10:13     Titel: varargout-Fehler bei eigener Funktion
  Antworten mit Zitat      
Hallo zusammen!
Ich habe eine Funktion programmiert, die mir verschiedene 2D-Arrays in ein 3D-Array umwandeln.

Code:

function [varargout] = twoD2threeD(varargin)

number_of_input_variables = nargin;

for k = 1:number_of_input_variables
    [rows(k), columns(k)] = size(varargin{k});
end

% Adapting Maximum Rows
[maximum_rows, index_max_rows] = max(rows);

for k = 1:number_of_input_variables
    if k ~= index_max_rows
        adapting_array = zeros(maximum_rows-rows(k), columns);
        adapting_array(:,:) = NaN;
        adapting_array_cell = num2cell(adapting_array);
        varargin{k} = [varargin{k}; adapting_array_cell];
    end
end

% Creating 3D-Array
for k = 1:number_of_input_variables
    varargout(:,:,k) = varargin{k};
end

end
 


Der Output ist eigentlich nur eine 3D-Matrix, doch bei dem Aufruf der Funktion erscheint folgende Fehlermeldung:

Error using twoD2threeD
Too many output arguments.


Wo liegt da der Fehler?

Herzlicher Gruß und vielen Dank!

Slamdunker23
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.06.2013, 11:00     Titel:
  Antworten mit Zitat      
Hallo,

varargout sollte ein Cell Array sein. Der Inhalt jeder Cell entspricht dann einem Ausgabeargument.
Ich persönlich verwende mit varargout immer nargout, damit klar ist, wieviele Rückgabeargumente beim Aufruf angefordert werden und man keine unnötigen Berechnungen ausführt.

Bei weiteren Problemen bitte auhc sagen, wie die Funktion aufgerufen wird.

Grüße,
Harald
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: 27.06.2013, 11:03     Titel: Re: varargout-Fehler bei eigener Funktion
  Antworten mit Zitat      
Hallo Slamdunker23,

Bitte lies nochmal die Dokumentation zu VARARGOUT durch:
Code:

VARARGOUT ist ein Cell array und muss zunächst initialisiert werden. Du möchtest aber nur ein einziges Output bekommen. Dann wäre eine normale Variable geeigneter:
Code:

function Out = twoD2threeD(varargin)

nMatrix = nargin;
rows = cellfun('size', varargin, 1);
cols = cellfun('size', varargin, 2);

Out = NaN(max(rows), max(cols), nMatrix);
for k = 1:nMatrix
  Out(1:rows(k), 1:cols(k), k) = varargin{k};
end


Bemerkung:
Code:
adapting_array = zeros(maximum_rows-rows(k), columns);

Dies dürfte ein Bug sein, da "columns" ein Vektor ist. Wahrscheinlich was "columns(k)" gemeint.

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

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 27.06.2013, 13:38     Titel:
  Antworten mit Zitat      
Vielen Dank euch beiden, ich bin einen Schritt weitergekommen.
Ich habe dein Skript Jan angepasst, dass die NaN-Matrix ein Cell-Array ist, da meine Input-Variablen ebenfalls Cell-Arrays sind.

Wenn ich dann im Workspace folgendes eingebe:
Code:

Output = twoD2threeD(A,B,C,D)
 


Dann bekomme ich folgende Fehlermeldung:

Code:

Undefined function 'sparse' for input arguments of type 'logical' and attributes 'full 3d real'.

Error in cell/tostr (line 18)
            bEmpty = sparse(cellfun('isempty', obj));

Error in displayobj (line 17)
    disp(tostr(obj))

Error in cell/display (line 2)
    displayobj(obj);
 


Die Größe der Output-Matrix ist ungefähr 60x400x5.
Wenn ich die erste page anzeigen lassen will, also

Code:

Out(:,:,1)
 


Dann erscheint folgende Meldung:

Code:

Index exceeds matrix dimensions.

Error in double/numvec2cellstr (line 20)
        bBig = strcmp(cellItems(:,4),'+');

Error in double/tostr (line 21)
            strs(bNormal) = numvec2cellstr(obj(bNormal));

Error in cell/tostr (line 38)
                    str2dsNV = tostr(numbers, bNumberValue);

Error in displayobj (line 17)
    disp(tostr(obj))

Error in cell/display (line 2)
    displayobj(obj);
 



Ist das Cell-Array zu groß, damit Matlab dieses anzeigen kann?
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: 27.06.2013, 15:23     Titel:
  Antworten mit Zitat      
Hallo Slamdunker23,

Zitat:
Ich habe dein Skript Jan angepasst, dass die NaN-Matrix ein Cell-Array ist, da meine Input-Variablen ebenfalls Cell-Arrays sind.

Das verstehe ich nicht. Eine NaN-Matrix ist laut Definition ein DOUBLE-Array und kann kein Cell-Array sein. Wieso sind die Input-Arrays Cell-Arrays? In dem gezeigten Code wird VARARGIN benutzt, was ein Cell-Array ist, aber die Inhalte sind doch Matrizen, oder?

Die Fehlermeldungen sind sehr rätselhaft. Bitte zeige uns doch nochmal den Code, damit wir einschätzen können, was Du genau machst. Erraten lässt sich das nicht.

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

Forum-Century

Forum-Century


Beiträge: 101
Anmeldedatum: 03.11.09
Wohnort: Stuttgart
Version: R2012b
     Beitrag Verfasst am: 01.07.2013, 13:42     Titel:
  Antworten mit Zitat      
Hallo zusammen!
Ich habe den Code nochmals angepasst und nun klappt auch der Aufruf mit varargout.
Ich habe verstanden, dass varargout ein Cell-Array ist und jeder Output in einer dieser Cells gespeichert wird. So habe ich das nun auch umgesetzt:


Code:

% This function creates a 3D-Cell Array from a different number of 2D-Cell
% Arrays.

% Input: different number of 2D-Cell Arrays

% Output: 3D-Cell Array (Output_3D), amount of rows and columns of each
% input 2D-Cell Array, size of 3D-Array

% The input arrays are adapted to have the same size.

% Author:
% Date: 27/06/2013
% -------------------------------------------------------------------------

function [varargout] = twoD2threeD(varargin)

number_of_input_variables = nargin;

rows = cellfun('size', varargin, 1);
columns = cellfun('size', varargin, 2);

% Adapting Maximum Rows
%[maximum_rows, index_max_rows] = max(rows);
% Adapting Maximum Columns
%[maximum_columns, index_max_columns] = max(columns);

Output_3D_raw = NaN(max(rows), max(columns), number_of_input_variables);
Output_3D = num2cell(Output_3D_raw);
% for k = 1:number_of_input_variables
%     if k ~= index_max_rows || k ~= index_max_columns
%         adapting_array = zeros(maximum_rows-rows(k), maximum_columns-columns(k));
%         adapting_array(:,Smile = NaN;
%         adapting_array_cell = num2cell(adapting_array);
%         varargin{k} = [varargin{k}; adapting_array_cell];
%     end
% end

% Creating 3D-Array
for k = 1:number_of_input_variables
    Output_3D(1:rows(k), 1:columns(k), k) = varargin{k};
end

% Size of 3D-Array
[rows_3D, columns_3D, pages_3D] = size(Output_3D);

varargout{1} = rows;
varargout{2} = columns;
varargout{3} = Output_3D;
varargout{4} = pages_3D;

end

% -------------------------------------------------------------------------
 



Die Funktion liefert mir die Reihen- und Spaltenanzahl der Inputarrays und gibt mir das 3D-Array mit der Anzahl der dritten Dimension aus.

Vielen Dank für eure Geduld!

Herzlicher Gruß, Slamdunker23
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 - 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.