399 Stimmen

Wie kann ich ein von einer Funktion zurückgegebenes MATLAB-Array indizieren, ohne es vorher einer lokalen Variablen zuzuweisen?

Wenn ich zum Beispiel den mittleren Wert von magic(5) Ich kann das so machen:

M = magic(5);
value = M(3,3);

zu bekommen value == 13 . Ich würde gerne so etwas wie das hier machen können:

value = magic(5)(3,3);
value = (magic(5))(3,3);

um auf die Zwischenvariable zu verzichten. MATLAB beschwert sich jedoch über Unbalanced or unexpected parenthesis or bracket auf die erste Klammer vor der 3 .

Ist es möglich, Werte aus einem Array/einer Matrix zu lesen, ohne sie vorher einer Variablen zuzuweisen?

12voto

titus Punkte 442

Wenn Sie die Laufzeiten mit der Standardmethode (Zuweisung des Ergebnisses und dann Zugriff auf die Einträge) vergleichen, sind sie genau gleich.

subs=@(M,i,j) M(i,j);
>> for nit=1:10;tic;subs(magic(100),1:10,1:10);tlap(nit)=toc;end;mean(tlap)

ans =

0.0103

>> for nit=1:10,tic;M=magic(100); M(1:10,1:10);tlap(nit)=toc;end;mean(tlap)

ans =

0.0101

Meiner Meinung nach ist die Quintessenz: MATLAB hat keine Zeiger, man muss damit leben.

6voto

Vugar Punkte 99

Es könnte einfacher sein, wenn Sie eine neue Funktion erstellen:

function [ element ] = getElem( matrix, index1, index2 )
    element = matrix(index1, index2);
end

und verwenden Sie es dann:

value = getElem(magic(5), 3, 3);

3voto

Andreas GS Punkte 441

Ihre anfängliche Notation ist die prägnanteste Art, dies zu tun:

M = magic(5);  %create
value = M(3,3);  % extract useful data
clear M;  %free memory

Wenn Sie dies in einer Schleife tun, können Sie M einfach jedes Mal neu zuweisen und die Clear-Anweisung ebenfalls ignorieren.

1voto

nirvana-msu Punkte 3566

Um die Antwort von Amro zu ergänzen, können Sie Folgendes verwenden feval anstelle von builtin . Es gibt keinen wirklichen Unterschied, es sei denn, Sie versuchen, die Operator-Funktion zu überladen:

BUILTIN(...) ist dasselbe wie FEVAL(...), mit dem Unterschied, dass es die die ursprüngliche eingebaute Version der Funktion aufruft, auch wenn eine überladene Version existiert (damit dies funktioniert, dürfen Sie niemals die Funktion BUILTIN ÜBERLADEN).

feval('_paren', magic(5), 3, 3) % M(3,3) ans = 13

feval('_brace', num2cell(magic(5)), 3, 3) % C{3,3} ans = 13

Interessant ist, dass feval scheint nur ein kleines bisschen schneller zu sein als builtin (um ~3,5 %), zumindest in Matlab 2013b, was seltsam ist, wenn man bedenkt, dass feval muss prüfen, ob die Funktion überladen ist, im Gegensatz zu builtin :

>> tic; for i=1:1e6, feval('_paren', magic(5), 3, 3); end; toc;
Elapsed time is 49.904117 seconds.
>> tic; for i=1:1e6, builtin('_paren', magic(5), 3, 3); end; toc;
Elapsed time is 51.485339 seconds.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X