0

Ich habe Probleme beim Erstellen einer Funktion, die das tut, was ich will. Ich versuche eine anonyme Funktion zu erstellen, die beim Akzeptieren eines Vektors der Länge N eine NxN-Matrix erzeugt. Ich möchte jedes Element der Matrix (dh mit einer Schleife) füllen. Ein kurzes Beispiel um genauer zu sein:Matrixfunktion der Vektoreingabevariablen erstellen (Matlab)

N = 2; 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) [email protected](x) Qjk(x(k),rand); 

    end 
end 

Am Ende sollten diese produzieren, zB .:

Q = @(x) [.23*x(1), .16*x(2); .95*x(1), .62*x(2)] 

ich den letzten Ausdruck oben mit der Hand schreiben kann und es funktioniert wie gewünscht, aber ich Ich kann diesen Prozess nicht mit einer Schleife/Vektorisierung automatisieren. Vielen Dank.

+0

sonst noch jemand einen Vorschlag? – ConfusinglyCuriousTheThird

Antwort

1

So ist es mein Verständnis, dass Sie eine N x N Matrix von Elementen erstellen möchten, wo die Eingabe ein Vektor der Länge ist N? ... und genauer gesagt, wollen Sie jedes Element in dem Eingangsvektor nehmen x und erzeugen ein neue 1 x N Vektor wo jedes Element in x wird von diesem neuen 1 x N Vektor skaliert?

Sie können Schleifen vermeiden, indem bsxfun mit:

Q = bsxfun(@times, x(:).', rand(numel(x))); 

Ich bin nicht sicher, welche Form x ist, ob es sich um eine Zeilen- oder Spaltenvektor ist, aber ich werde keine Annahmen getroffen werden. x(:).' stellt sicher, dass Ihr Vektor ein Zeilenvektor wird. Wenn Sie jedoch möchten, dass Ihr Code so funktioniert, entfernen Sie die anonyme Funktionsdeklaration in der eigentlichen Schleife selbst. Wahrscheinlich möchten Sie auch Qjk aufrufen, da dies die Funktion ist, die Sie deklariert haben, nicht Q, da dies die Matrix ist, die Sie zu füllen versuchen.

einfach tun:

N = 2; 
Q = zeros(N); % New - Allocate to be more efficient 
Qjk = @(x,y) x * y; 

for j = 1:N 
    for k = 1:N 

    Q(j,k) = Qjk(x(k),rand); % Change 

    end 
end 
+0

Was ich oben habe ja einmal habe ich die anonymen Funktionsaufrufe entfernt. Ich habe gerade die Matrizen direkt ausgefüllt. Kannst du 'bsxfun' nicht einfach benutzen? Es macht, was Sie wollen, und Sie können es sogar in eine anonyme Funktion einfügen, wenn Sie es wünschen. 'Q = @ (x) bsxfun (@times, x (:). ', Rand (numerisch (x)));'. – rayryeng

+0

Hallo Ray, eigentlich tun diese Lösungen nicht, was ich will - ich möchte, dass das Ergebnis eine anonyme Funktion von 'x' ist. Bei beiden scheint es erforderlich zu sein, zuerst 'x' zu definieren. Irgendwelche Gedanken? – ConfusinglyCuriousTheThird

+0

Dies ist: 'Q = @ (x) bsxfun (@times, x (:). ', Rand (numel (x)));' erfordert nicht, dass Sie 'x' zuerst definieren. Es ist einfach der gleiche Code, den ich oben geschrieben habe, aber in einer anonymen Funktion verpackt. Sie können also einfach einen Vektor einfügen und es wird eine 'N x N' Matrix für Sie ausgeben. – rayryeng