web-dev-qa-db-de.com

Wie initialisiere ich alle Einträge einer Matrix mit einem bestimmten Wert?

In Haskell , wenn ich eine Liste mit 10 Elementen erhalten wollte, die nur die Nummer 5 enthielt, könnte ich so etwas tun:

take 10 $ repeat 5

Ausgabe:

[5,5,5,5,5,5,5,5,5,5]

Gibt es so etwas in Matlab?

40
Tyler

Wiederholte Werte können einem Array leicht zugewiesen werden:

x(1:10) = 5;

Wenn Sie das Array von Elementen inline in einer Anweisung generieren möchten, versuchen Sie Folgendes:

ones(1,10) * 5

oder mit repmat

repmat(5, 1, 10)
65
dkantowitz

Die one-Methode ist viel schneller als die Verwendung von repmat:

>> tic; for i = 1:1e6, x=5*ones(10,1); end; toc
Elapsed time is 3.426347 seconds.
>> tic; for i = 1:1e6, y=repmat(5,10,1); end; toc
Elapsed time is 20.603680 seconds. 

Und macht meiner Meinung nach viel besser lesbaren Code.

22
MatlabSorter

Siehe repmat in der Dokumentation.

B = repmat(5,1,10)
5
zellus

Angenommen, Sie haben eine vordefinierte m-by-n-Matrixgröße und den Zielwert val in Ihrem Beispiel:

m = 1;
n = 10;
val = 5;

derzeit gibt es 7 verschiedene Ansätze, die mir in den Sinn kommen:


1) Verwenden der repmat - Funktion _ ​​(0,094066 Sekunden)

A = repmat(val,m,n)

2) Indizierung in der undefinierten Matrix mit Zuweisung _ ​​(0,091561 Sekunden)

A(1:m,1:n) = val

3) Indexierung des Zielwerts mit der one Funktion _ ​​(0,151357 Sekunden)

A = val(ones(m,n))

4) Standardinitialisierung mit vollständiger Zuordnung _ ​​(0.104292 Sekunden)

A = zeros(m,n);
A(:) = val

5) Verwendung der Funktion one mit Multiplikation _ ​​(0,069601 Sekunden)

A = ones(m,n) * val

6) Verwendung der Funktion zeros mit dem Zusatz _ ​​(0,057883 Sekunden)

A = zeros(m,n) + val

7) Verwendung der repelem -Funktion _ ​​(0,168396 Sekunden)

A = repelem(val,m,n)

Nach der Beschreibung jedes Ansatzes zwischen Klammern wird der entsprechende Benchmark unter Matlab 2017a und mit 100000-Iterationen durchgeführt. Der Gewinner ist der 6th-Ansatz, und das überrascht mich nicht.

Die Erklärung ist einfach: Die Zuweisung erzeugt im Allgemeinen nullgefüllte Speicherplätze ... Daher werden keine anderen Operationen ausgeführt, außer dem Hinzufügen von val zu jedem Element der Matrix. Darüber hinaus ist die Bereinigung von Eingabeargumenten sehr kurz.

Dasselbe kann nicht für den 5th-Ansatz gesagt werden, der der zweitschnellste ist, da trotz des grundsätzlich gleichen Aufbereitungsprozesses der Eingabeargumente auf Speicherseite drei Vorgänge statt zwei ausgeführt werden:

  • die anfängliche Zuordnung
  • die Umwandlung jedes Elements in 1
  • die Multiplikation mit val
5

Wie in anderen Antworten erwähnt, können Sie Folgendes verwenden:

>> tic; x=5*ones(10,1); toc
Elapsed time is 0.000415 seconds.

Eine noch schnellere Methode ist:

>> tic;  x=5; x=x(ones(10,1)); toc
Elapsed time is 0.000257 seconds.
0
bluefocs