2016-09-08 4 views
2

Ich brauche Hilfe beim Erstellen eines Zellenarrays in MATLAB, wobei jede Zelle ein Array mit verschiedenen Größen ist. Zum Beispiel, nehmen sie an, ich habe diese einfache Anordnung und den Wert:Weisen Sie den Zellenarrays in MATLAB auf einmal unterschiedliche Werte zu

A = [5 3 8 7 0 4 1]; 
B = 10; 

Das Zellenfeld C muss so beschaffen sein, dass:

C = 
[10 20 30 40 50] 
[10 20 30] 
[10 20 30 40 50 60 70 80] 
[10 20 30 40 50 60 70] 
[Empty matrix 1x0] 
[10 20 30 40] 
[10] 

Ist es möglich, nur dass in einem Arbeitsgang zu tun? Ich habe versucht:

C = cellfun(@(a,b)b*ones(1,a), A,B) 

aber es hat nicht funktioniert.

Antwort

3

cellfun erwartet ein Zellenfeld als Eingabe in die Funktion. Sie haben ein numerisches Array, verwenden Sie stattdessen arrayfun. Sie geben auch keinen Skalar pro Element im Array aus, daher müssen Sie das Flag UniformOutput auf 0 setzen. Verwenden Sie schließlich den Operator colon, um das zu tun, was Sie anstelle der Matrixmultiplikation benötigen. Die Ausgabe wird leider einen Zeilenvektor von Zellen sein, so wenn Sie unbedingt einen Spaltenvektor müssen wie, was Sie in Ihrem Beitrag gezeigt haben, den Ausgang transponieren:

A = [5 3 8 7 0 4 1]; 
B = 10; 
C = arrayfun(@(x) B*(1:x), A, 'UniformOutput', 0).'; 

Beachten Sie, dass die anonyme Funktion als die erste Eingabe erklärt in arrayfun hat lexikalischen Geltungsbereich, was bedeutet, dass alle Variablen, die im Arbeitsbereich vor der Deklaration der anonymen Funktion sichtbar waren, sichtbar sind. Sie können einfach auf diese Variable innerhalb Ihrer Funktion zugreifen, anstatt sie manuell als separaten Eingang in arrayfun einzuteilen.

Wir bekommen:

>> format compact 
>> celldisp(C) 
C{1} = 
    10 20 30 40 50 
C{2} = 
    10 20 30 
C{3} = 
    10 20 30 40 50 60 70 80 
C{4} = 
    10 20 30 40 50 60 70 
C{5} = 
    [] 
C{6} = 
    10 20 30 40 
C{7} = 
    10 
+0

Hallo ich, dass ich das auch versucht, vergessen zu sagen ... es sagt, 'Nicht definierte Funktion‚Doppelpunkt‘für Eingabeargumente vom Typ‚Zelle‘. Fehler in @ (x) B * (1: x) ' – PhoenixBlue

+0

@PhoenixBlue' cellfun' erwartet ein ** Zellenfeld **. Bitte lesen Sie meinen Beitrag vollständig. Du wirst bemerken ** Ich habe 'cellfun' ** nicht benutzt. – rayryeng

+0

OH! Entschuldigung, mein fehler! es funktionierte! Ich habe einfach das Zellen-Array anstelle des einfachen Arrays (sogar in meinem ersten Versuch ...) !! Danke noch einmal!! – PhoenixBlue

Verwandte Themen