2016-07-07 13 views
-2

行列の各要素を1から10までの値から10x1のゼロ行列に変換しようとしています。元の値に対応するゼロ行列の要素要素は、ここでは1Octave:ベクトルのmatix/vectorの要素を置換する

に等しいコードです:

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 

私はそれを実行すると、私はエラーA(I) = X: X must have the same size as Iを取得します。入力しようとしている行列が行列yの要素のサイズと一致しない場合私はこれを回避することはできますか?

サンプル入力:

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

出力例:

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

サンプル入力とそれに対応する出力を教えてもらえますか? – beaker

+0

y = [1; 2; 3; 4; 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つのステップでそれをすることを好むでしょう。 –

答えて

0

私は仮定のカップルを作るつもりです:

  1. あなたは戻り値はqようになりたいです関数の署名では、
  2. あなたがしているということです

    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 
    

がループ

エラーを与える問題を修正:はあなたのサンプルの場合の出力はそうのような10x5行列になりたいです10x1ベクターZERO5x1ベクターyの の単一(スカラー)要素に割り当てる3210

y(i) = ZERO; 

ベクトルがスカラーに収まらない。しかし、これを変更してZEROyという列に割り当てても、列の長さが異なるために適合しません。とにかくやりたいことではありません。うまくいけば、値はyに捨ててしまったでしょうから。では、出力配列qの列に値を設定しましょう。あなたがqを事前に割り当てる場合(変更のコメントで<==でマークされています。)

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 

ループに

を向上させる。これは動作しますが、あなたはすでにZEROの正確な数を持っていますベクトルなので、値を直接設定しないのはなぜですか?ループに

キリング

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 

これらのループのいずれかがあなたの望ましい結果が得られますが、あなたはループせずに、この全体の操作を行うことができます。This answerは、これを行うためのさまざまな方法をまとめたものが、私はあなたにsub2indを使用して最初の1だけ紹介します:それは、変数名としてi使用しないことをお勧めします

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; 

決勝ノート

をオクターブ/ MATLAB。その他の言語では自然ですが、MATLAB i(またはj)はimaginary unitです。変数としてiを使用すると、その定数がシャドウされます。複雑な値を割り当てるときに1i(または1j)を使用すると違いはありませんが、そのことを覚えておかなければならず、ある時点で忘れてしまいます。

関連する問題