Ich werde ein paar Annahmen machen:
- Sie der Rückgabewert sein wollen
q
als in der Funktionssignatur und
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.
Können Sie uns eine Beispieleingabe und die entsprechende erwartete Ausgabe geben? – beaker
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. –