2017-08-18 15 views
1

私は今発見したMatlabの動作を理解できません。ここでは、コードは次のとおりです。論理インデックスによって列の代わりに行が作成される

ix = logical([1; 0; 1]); 
value = [2; 2; 2]; 
newValue(ix) = value(ix) 

それは私が

2 
0 
2 

を期待しながら、私は自分のコードの前にnewValue = nan(size(value))を追加することで、それを「修正」することができます

​​

を出力します。しかし、私はを理解したいと思います。なぜ Matlabは列ベクトルから行を作成します。

+0

私はどちらも分かりませんが、newValue(ix、:) = value(ix) 'で期待通りの結果を得ることができます(' newValue'が存在しない場合はそうします)。 – Zep

+0

@ Zepの場合、私の関数の出力が入力と同じ次元を持つようにしたいという問題があります(例えば組み込みの 'sin'の場合のように)。しかし、事前割り当てがなければ、説明されているように動作しません。そして、それがうまくいかないという事実は、私がMatlabの次元について根本的なものを見逃していることを示しています。だから私は最初の原則から私を困惑させる: – texnic

+0

私は@ThéoP.があなたに答えたと思う:Matlabはデフォルトで行を作成する。列が必要な場合は、事前に割り当てるか、索引付けで指定します( 'newValue(ix、:)')。 – Zep

答えて

2

論理的なインデックス付けとは関係ないと思います。私はデフォルトのフォーマット(newValueは)行があることを前提としてい

ix=[1;2;3] 
value = [2; 2; 2]; 
newValue(ix)=value(ix) 

newValue = 

2  2  2 

と同じ動作を再現することができますし、(あなたは、X = 1を作成した場合、あなたが見ることができるように:3)それはあなたがこの結果を得る理由です。

x=1:3; 
x = 

1  2  3 

これを克服することで、新しい値を事前に割り当てることができます。

newValue=zeros(size(value)); 

または後処理によって

それ

newValue=newValue(:); 
4

あなたは、インデックスを使用して配列を作成するときので、この動作を行います。a(1) = 2; a(2) = 3;、Matlabの(およびオクターブ)行(a=[2, 3])を作成します。また、論理インデックスを使用する場合は、このメソッドを使用します。あなたのケースではMATLABは

newValue(1) = value(1); 
newValue(3) = value(3); 

を実行しかし@Irreducibleが言うように、あなたはnewValueに

を事前に割り当てることによって、これを避けることができますし、で論理インデックスを使用せずに同じ結果を得ることができます。

ix = [1; 0; 1]; 
value = [2; 2; 2]; 
newValue = value.*ix; 
関連する問題