2011-07-02 5 views
-3
if 1st column detect 1, then add 1 -1 -1 to 2nd to 4th column 
if 1st column detect 2, then add -1 1 -1 to 2nd to 4th column 
if 1st column detect 3, then add -1 -1 1 to 2nd to 4th column 

例:なる5x4行列MATLAB:3列のデータに1列のデータを表す

A = 
1 1 -1 -1 
2 -1 1 -1 
3 -1 -1 1 
2 -1 1 -1 
1 1 -1 -1 

:Aは5X1行列

A= 
1 
2 
3 
2 
1 

でiは以下のように結果を取得したいと思い私が下に書いたコードは、上記の結果を得ることができません、助けてください...

if A(1:end,1) == 1 
    A(1:end,2:4) = [1 -1 -1] 
else if A(1:end,1) == 2 
    A(1:end,2:4) = [-1 1 -1] 
else 
    A(1:end,2:4) = [-1 -1 1] 
end 
+0

何が問題?あなたの質問は何ですか? – YXD

+0

私は上記のコードを使用して結果を得ることができません。上記のように結果を得ることができますか? – weird

+0

あなたの書式を修正しました。それに同意しますか? (そうでない場合は元に戻してください)。しかし、もっと真剣に、あなたはすでにいくつかの答えを持っています。彼らに建設的なフィードバックを与えることは可能でしょうか?ありがとう – eat

答えて

0

最初に、ifステートメントの整数をベクトルと比較しています。それは動作しません。ベクトル全体をループし、各要素を単独でチェックする必要があります。割り当ては高価な操作であるように、それを変更する前に、結果の行列を事前に割り当てることも好ましい:

A = [A zeros(size(A,1), 3)]; 
for i=1:size(A,1) 
    if(A(i,1) == 1) 
     A(i,2:4) = [1 -1 -1]; 
    elseif(A(i,1) == 2) 
     A(i,2:4) = [-1 1 -1]; 
    elseif(A(i,1) == 3) 
     A(i,2:4) = [-1 -1 1]; 
    end 
end 
0

これはあなたのアイデアを与える必要があり、非常に簡単な方法は、この種をカプセル化する方法

>>> A= [1 2 3 2 1; zeros(3, 5)]'; 
>>> m= 1== A(:, 1); A(m, 2: 4)= repmat([ 1 -1 -1], sum(m), 1); 
>>> m= 2== A(:, 1); A(m, 2: 4)= repmat([-1 1 -1], sum(m), 1); 
>>> m= 3== A(:, 1); A(m, 2: 4)= repmat([-1 -1 1], sum(m), 1); 
>>> A 
A = 
    1 1 -1 -1 
    2 -1 1 -1 
    3 -1 -1 1 
    2 -1 1 -1 
    1 1 -1 -1 

あなたのコードに機能が組み込まれています。確かに明らかにrepmatを必要とする多くのMatlabの操作は、実際にいくつかの「賢い」で扱うことができることを、示唆

>>> A= [1 2 3 2 1; zeros(3, 5)]'; 
>>> I= [1 -1 -1; -1 1 -1; -1 -1 1]; 
>>> A= [A(:, 1) I(A(:, 1), :)] 
A = 
    1 1 -1 -1 
    2 -1 1 -1 
    3 -1 -1 1 
    2 -1 1 -1 
    1 1 -1 -1 

よう

>>> A= [1 2 3 2 1; zeros(3, 5)]'; 
>>> I= [1 -1 -1; -1 1 -1; -1 -1 1]; 
>>> for k= 1: size(I, 1) 
    > m= k== A(:, 1); A(m, 2: 4)= repmat(I(k, :), sum(m), 1); 
    > end 

あるいはよりコンパクト、のような例えば

インデックス作成スキーム。

2

あなたは、単にインデックスを使用することができます。

V = [ 
    1 -1 -1 %# rule 1 
-1 1 -1 %# rule 2 
-1 -1 1 %# rule 3 
]; 

A = [1;2;3;2;1]; 

newA = [A V(A,:)]; 

結果:

newA = 
    1  1 -1 -1 
    2 -1  1 -1 
    3 -1 -1  1 
    2 -1  1 -1 
    1  1 -1 -1 
+2

これは私のソリューションよりもエレガントで、実際にはMATLABでこれを行う「正しい」方法です。 – You

関連する問題