2016-05-14 4 views
1

Ich möchte eine Matrix bekannter Dimension in Octave erzeugen. Das Problem ist, dass ich die Matrix nicht mit Nullen initialisieren möchte. Die Matrix enthält nur 0 oder 1, aber die Elemente (Zellen), denen kein Wert zugewiesen wird, müssen leer bleiben. Planen Sie die Verwendung einer solchen Matrix in "Collaborative Filtering" algo.Generieren einer leeren Matrix mit bekannten Dimensionen

Ich bin neu in Ocatve und 'Collaborative Filtering' Algos. Ich habe versucht, im Internet nach der Lösung zu suchen, aber ohne Erfolg. Schlüsselwörter Leere Matrix im Netz bezieht sich auf Arrays mit Nulldimensionen oder einer Char-Matrix mit "" als Werten.

Antwort

4

Ein numerisches Array kann keine leeren Werte enthalten. In diesem Fall verwenden die Benutzer normalerweise NaN als Platzhalterwert.

%// Initialize a 3D matrix of NaN values 
data = nan(2, 3, 4); 

size(data) 
%// 2 3 4 

Es ist dann einfach, einen Platzhalterwert von echten Daten zu unterscheiden. Sie können sie unter Verwendung von isnan erkennen.

Die einzige Möglichkeit, ein Array leerer Werte zu erstellen (und aufgrund des Leistungseinbruchs wird davon abgeraten), ist die Verwendung von Zellenfeldern.

data = cell(2, 3, 4); 
0

Das Problem ist, dass ich will nicht die Matrix mit Nullen initialisieren. Die Matrix enthält nur 0 oder 1, aber die Elemente (Zellen), denen kein Wert zugewiesen wird, müssen leer bleiben.

Sie liegen falsch. Sie können denken, dass die Matrix nur Werte 0 oder 1 enthält, aber tatsächlich hat sie einen Wert von 0, 1 oder nicht gesetzt. Sie können keinen leeren Wert haben, Sie brauchen immer einen Wert. Oder zumindest nicht so, wie du denkst. Bei einem sehr niedrigen Level müssen alle Bissen einen Wert (0 oder 1) haben, sie dürfen nicht leer sein. Wenn Sie also einen leeren Wert haben möchten, müssen Sie einen Wert als leer interpretieren.

Ihre Daten haben dann drei Zustände: true, false und blank. Sie werden also mindestens 2 Bits pro Punkt benötigen (beachten Sie, dass sogar logische/bool Datentypen, die nur 1 Bit benötigen, actually take up 8 bits (1 byte)).

Mit NaN

Diese wie die simples Lösung aussehen, aber es ist eigentlich ziemlich schlecht. Es wird eine riesige Verschwendung von Speicher sein (und Sie werden sehr große Matrizen haben, wenn Sie kollaboratives Filtern durchführen).

Der Grund ist, dass wenn Sie NaN verwenden, Ihre Daten vom Typ einzeln oder doppelt sein müssen. Das sind mindestens 32 oder 64 Bits. Denken Sie daran, dass Sie nur 2 Bits benötigen. Natürlich könnten Sie Ihren eigenen Datentyp erstellen, der einen NaN Wert hat.

octave> vals = NaN (3, 3) # 3x3 matrix of type double (default) 
vals = 

    NaN NaN NaN 
    NaN NaN NaN 
    NaN NaN NaN 

octave> vals = NaN (3, 3, "single") # 3x3 matrix of type single 
vals = 

    NaN NaN NaN 
    NaN NaN NaN 
    NaN NaN NaN 

Unter Verwendung einer Zellmatrix

cell array A ist ein Datentyp, wobei jede Zelle eine beliebige Octave Wert sein kann. Dies umfasst ein anderes Zellenarray, eine Matrix mit beliebigen Dimensionen oder sogar ein leeres Array. Sie könnten ein leeres Array als leer verwenden, aber das wird sowohl für Speicher als auch für Geschwindigkeit sehr ineffizient sein, und Sie werden nicht in der Lage sein, die meisten Funktionen zu verwenden, da sie auf numerischen Arrays und nicht auf Zellenarrays arbeiten.

octave> vals = cell (3, 3); # create 3x3 cell matrix 
octave> vals{2,3} = true; # set value 
octave> vals{2,3} = false; # set value 
octave> vals{2,3} = []; # unset value 
octave> cumsum (vals) 
error: cumsum: wrong type argument 'cell' 
octave> nnz (vals) 
error: nnz: wrong type argument 'cell array' 
octave> find (vals) 
error: find: wrong type argument 'cell' 

Verwendung von 8-Bit-Integer

Das ist, was ich sehe am häufigsten verwendet wird.Wenn Sie 8 Bit mit Vorzeichen verwenden, können Sie 0 für Leerzeichen, -1 für Falsch und 1 für Wahr (oder was auch immer am sinnvollsten ist) verwenden.

octave> vals = zeros (3, 3, "int8"); 

eine separate Matrix Leerwert

zu verfolgen Wenn Sie wirklich wirklich eine Matrix von 0 und 1 haben wollen, dann müssen Sie eine separate Matrix zu verfolgen, die Werte eingestellt. In diesem Fall können beide Matrizen vom Typ logisch sein und daher jeweils 8 Bit pro Datenpunkt aufnehmen, was bei 16 Bit pro Datenpunkt liegt. Es hat auch das Problem, dass Sie die zwei Matrizen synchron halten müssen.

octave> vals = false (3, 3); 
octave> set_vals = false (size (vals)); 

Ihre eigene Klasse

Entweder die neue classdef mit (erfordern Octave 4.0.0) die old @class type, Sie eine der Strategie kapseln oben (ich persönlich würde ein 8-Bit-Integer verwenden) auf seine eigene Klasse. Dies verschiebt die Logik, zu wissen, welcher Wert (-1 oder 0) leer ist, wenn Sie ein vorzeichenbehaftetes 8-Bit verwenden. Oder wenn Sie eine separate Matrix für leere Werte verwenden möchten, verschieben Sie die Logik, um die Werte synchron zu einer Setter-Methode zu halten.