2017-08-07 5 views
0

I habe den folgenden Code, in Octave:Wie kann man eine Funktion während der Matrixtransformation verwenden?

% recode y to Y 
I = eye(10); 
Y = zeros(5000, 10); 
for i=1:5000 
    Y(i, :)= I(y(i), :); 
end 

y 5000 x 1 und enthält Werte von 1 bis 10 Die gewünschte Ausgangs Y. ist Y beträgt 5000 x 10 und enthält alle 0s außer A 1 in der Position in der gleichen Zeile von y angezeigt.

Ich möchte dies ohne eine Schleife für akademische Zwecke tun; d.h. vektorisieren.

Ein 5000 x 1 * 1 x 10 gibt mir eine 5000 x 10 Antwort, aber die 1 x 10 hier muss während der Matrixmultiplikation für jede Zeile ändern, um alle 0 außer der von der "aktuellen" Zeile angegebenen Position zu enthalten von y.

Wie kann ich es tun?

+0

Ich denke, Ihre Frage ist besser für StackOverflow geeignet. In jedem Fall, schau einfach "logische Indexierung"; Das wird dir die Lösung bringen, die du willst. –

Antwort

1

Es stellt sich heraus, dass eye(10)(r,c)r einen Vektor für Argument kann, etwa so:

Y = eye(10)(y,:) 

ich dies durch Versuch und Irrtum erst jetzt entdeckt. Es sieht so aus, als gebe es die richtige Antwort und es braucht keine Schleife. Es ist viel einfacher und hoffentlich schneller.

1

Verwendung von „Ketten Indizierung“ ein (..) (...) ist eine Oktave hinaus (nicht verfügbar in Matlab) und hat nichts mit „eine Funktion verwenden, während der Matrixmultiplikation tun“ zu tun

Auf jeden Fall

c = 5e3; 
r = 10; 
y = randi (c, r, 1); 

## Answer from toddmo 
tic 
Y = eye(c)(y,:); 
toc 

## Answer from Andy 
tic 
Y2 = sparse (1:r, y, 1, r, c); 
toc 

## Ensure, that they are equal 
assert (Y, full (Y2)); 

## check the size in memory 
whos 

gibt

Elapsed time is 0.0635939 seconds. 
Elapsed time is 0.000108957 seconds. 
Variables in the current scope: 

Attr Name  Size      Bytes Class 
==== ====  ====      ===== ===== 
    Y   10x5000     400000 double 
    Y2   10x5000     40168 double 
    ans   5x10      400 double 
    c   1x1       8 double 
    r   1x1       8 double 
    y   10x1       80 double 

Total is 100062 elements using 440664 bytes 

Wie Sie das Beschleunigungsfaktor sehen kann, ist> 500 und der Speicherverbrauch nur ein Zehntel ... Sie verwenden können:, sollten Sie eine sparse Matrix für die Erstellung und Speicherung verwenden das spärliche Matrix in fast jeder Berechnung, wie Sie eine vollständige Matrix verwenden würden. Verwenden Sie full, um es zu konvertieren, wenn Sie wirklich benötigen

+0

Was Ihre erste Aussage betrifft, meinte ich "benutze eine Funktion während der Matrix-Transformation". Die Funktion, die meine Antwort verwendet, die Sie Chain-Indizierung nennen, ist eine Funktion im algorithmischen Sinne; es ist eine Nachschlagefunktion. Ich habe meinen Titel korrigiert. – toddmo

+0

Ich verstehe 'spärlich' nicht. Was es tut, was die Argumente sind oder wie sie von der Funktion verwandt oder verwendet werden. Nicht nur, indem ich nur auf deine Antwort schaue. Sie haben auch die normale Bedeutung von 'r' (Zeile) und' c'-Spalte invertiert. '5e3' klärt die Dinge auf. Wenn meine Antwort Auge (10) ist, dann rufst du es falsch mit Auge (5000) an. – toddmo

+0

Sie haben Recht, ich habe die Anzahl der Zeilen und Spalten in meiner Antwort geändert. 5e3 ist wissenschaftliche Notation für 5000 (okay?). Eine Sparse-Matrix speichert die Nullen nicht (in Ihrem Fall 90%). – Andy

Verwandte Themen