2017-01-04 6 views
2

jetzt meine Aufgabe wollen, ist eine Zelle C zu konstruieren, die Matrizen enthalten, die ersten Dimensionen in einem VektorBaukonstruktion Zelle, die verschiedene Größen von Matrizen unterschiedlicher Dimension enthält

n = [12 23 54] enthalten sind.

Während ihre zweite feste Abmessungen sind mit

r = 3.

Also, ich möchte die Zelle C = {rand(12,3), rand(23,3), rand(54,3)}.

Ich weiß for-loop meinen Zweck dienen kann, wie:

C=cell(3,1) % pre-allocation 

for i = 1 : length(n) 
    C{i} = rand(n(i),r); 
end 

Darf ich wissen, wenn ich es tun kann smarter ohne for loop in Matlab? Danke

Antwort

1

Es gibt wirklich keinen Schaden bei der Verwendung einer for Schleife in diesem speziellen Szenario (und in den meisten Fällen, in denen die einzige Alternative ist cellfun oder arrayfun) as it is easier for MATLAB's JIT compiler to handle, aber wenn Sie wirklich abgeneigt sind zu einem for-Schleife können Sie arrayfun verwenden kombiniert mit ungleichmäßiger Ausgabe, um Ihnen das gewünschte Ergebnis zu geben.

C = arrayfun(@(x)rand(x, r), n, 'UniformOutput', false); 

langsamer tatsächlich Dies kann als die for-Schleife für den oben genannten Gründen. Aber hey, es ist eine Zeile, das ist alles was zählt!

+0

Vielen Dank und Ihre Einführung für den 'arrayfun' Befehl für mich. – nam

+0

"Kein Schaden in der Verwendung einer' for' Schleife "ist eine sehr allgemeine Aussage. In diesem Zusammenhang (Zellen-Arrays) gibt es keinen Schaden. In anderen Kontexten, wie z. B. numerischen Array-Berechnungen, gibt es ein paar Sonderfälle, für For-Schleifen gibt es nur einen marginalen Nachteil, aber normalerweise massive Vorteile, um sie zu vermeiden. – jez

+0

@jez Glauben Sie mir, ich bin mir bewusst. Ich nahm an, dass, da ich eine * spezifische * Frage beantwortete, daraus geschlossen werden konnte, dass dieser Kommentar * direkt * auf das vorliegende Problem bezogen war. – Suever

1

for und while Schleifen haben ihren Platz, auch in Matlab. Ihnen wurde wahrscheinlich gesagt, dass Sie sie vermeiden sollten, da vektorisierte Operationen beim Durchlauf der Zeilen, Spalten oder anderen Dimensionen eines gepackten numerischen Arrays viel schneller sind. Aber bei Konstrukten höherer Ebene, wie z. B. Zellen-Arrays, gibt es oft keinen Vorteil (und eine Lesbarkeits-Strafe), wenn man versucht, alles in einfachen quasi-vektorisierten Anweisungen zu tun. Ihre bestehende Lösung ist wahrscheinlich der beste Ansatz.

1

Eine kürzere Alternative, nur so zum Spaß:

C = mat2cell(rand(sum(n),r), n,r)'; 

Aber eine einfache Schleife ist mit ziemlicher Sicherheit am schnellsten in diesem Fall, da mat2cell eine Schleife verwendet, sowie reichlich Kontrollen an seinen Eingängen.

Verwandte Themen