2016-07-07 12 views
-2

Ich versuche, jedes Element in einer Matrix von einem Wert von 1 bis 10 in eine 10x1 Nullstellenmatrix zu verwandeln, wobei das Element der Nullstellenmatrix dem Wert des Originals entspricht Element gleich 1Octave: Ersetze Element von matix/vector mit einem Vektor

Hier ist der Code:

function q = convert 

% Convert y matrix values to 10x1 vector 

load('y.mat'); 

ZERO = zeros(10,1); 

% Set 10x1 Matrix of zeros 

for i = 1:length(y) 

    ZERO(y(i)) = 1; % Set yth element of ZERO to 1 

    y(i) = ZERO; % Set ith element of y equal to new zero 

    ZERO = zeros(10,1); % Re-establish zero 

endfor 

Wenn ich es laufen erhalte ich die Fehler A(I) = X: X must have the same size as I. Wo die Matrix, die ich eingeben möchte, nicht mit der Größe des Elements der Matrix y übereinstimmt. Kann ich das umgehen?

Probeneingang:

y = [1; 2; 3; 4; 5] 

Beispielausgabe:

y = [[1;0;0;0;0;0;0;0;0;0], 
    [0;1;0;0;0;0;0;0;0;0], 
    [0;0;1;0;0;0;0;0;0;0], 
    [0;0;0;0;1;0;0;0;0;0], 
    [0;0;0;0;0;1;0;0;0;0]] 
+1

Können Sie uns eine Beispieleingabe und die entsprechende erwartete Ausgabe geben? – beaker

+0

y = [1; 2; 3; 4; 5] Eingabe und y = [[1; 0; 0; 0; 0; 0; 0; 0; 0; 0]; [0; 1; 0; 0; 0; 0; 0; 0; 0; 0] ; [0; 0; 1; 0; 0; 0; 0; 0; 0; 0]; [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]; [0; 0; 0; 0; 0; 1; 0; 0; 0; 0] Ausgabe. Ich habe es geschafft, indem ich die Transformation Element für Element vorgenommen habe, wo es erforderlich war. Ich hätte es lieber in einem Schritt wie diesem gemacht. –

Antwort

0

Ich werde ein paar Annahmen machen:

  1. Sie der Rückgabewert sein wollen q als in der Funktionssignatur und
  2. Sie möchten die Ausgabe in Ihrer Probe Fall eine 10x5 Matrix wie so sein:

    1 0 0 0 0 
    0 1 0 0 0 
    0 0 1 0 0 
    0 0 0 1 0 
    0 0 0 0 1 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    

Befestigung der Schleife

Das Problem, das den Fehler gibt, ist, dass Sie Zuweisen eines 10x1 Vektors ZERO zu einem einzelnen (skalaren) Element des 5x1 Vektors y:

y(i) = ZERO; 

Ein Vektor passt nicht in einen Skalar. Aber selbst wenn Sie dies ändern, um ZERO einer Spalte von y zuzuordnen, passt es nicht, da die Längen der Spalten unterschiedlich sind. Das ist sowieso nicht das, was du machen willst, denn wenn es funktioniert hätte, hättest du die Werte einfach in y gelöscht. Lassen Sie uns also die Werte in den Spalten des Ausgabe-Arrays setzen. (Änderungen werden mit <== in den Kommentaren markiert.)

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Set 10x1 Matrix of zeros 
ZERO = zeros(10,1); 
% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

for i = 1:length(y) 
    ZERO(y(i)) = 1;  % Set yth element of ZERO to 1 
    q(:,i) = ZERO;  % <== Set ith *column* of *q* equal to new zero 
    ZERO = zeros(10,1); % Re-establish zero 
endfor 

Verbesserung der Schleife

Dies funktioniert, aber wenn Sie q preallocate, Sie haben bereits die richtige Anzahl von ZERO Vektoren, also warum nicht einfach die Werte direkt setzen?

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

for i = 1:length(y) 
    q(y(i),i) = 1;  % <== Set element at y(ith) row and ith column of q to 1 
endfor 

die Schleife Töten

Entweder dieser Schleifen geben Sie die gewünschten Ergebnisse, aber man kann ohne eine Schleife diese ganze Operation zu tun.This answer fasst verschiedene Wege, dies zu tun, aber ich werde Ihnen zeigen, die ersten sub2ind mit:

function q = convert 
% Convert y matrix values to 10xn matrix 

%load('y.mat'); 
y = [1; 2; 3; 4; 5]; % <== replace load temporarily 

% Preallocate output array 
q = zeros(10, length(y)); % <== preallocate for speed 

idx = sub2ind(size(q), y, [1:length(y)].'); 
q(idx) = 1; 

Schlussbemerkung

Es ist am besten nicht zu verwenden i als Variablennamen in Oktave/MATLAB. Es ist natürlich in anderen Sprachen, aber in MATLAB i (oder j) ist die imaginary unit. Wenn Sie i als Variable verwenden, wird diese Konstante schattiert. Das macht keinen Unterschied, wenn Sie 1i (oder 1j) verwenden, wenn Sie komplexe Werte zuweisen, aber Sie müssen daran denken, das zu tun, und irgendwann werden Sie es vergessen.