2012-04-25 7 views
14

MATLABに2つのベクトルを混ぜ合わせたいと思います。実際には、私は実際には各要素の間にゼロを追加したいと思っていましたが、他の状況にこの方法を適用する方法を習得するような方法で質問しました。ベクトルを織り交ぜる

私の具体的なアプリケーション: ベクトル(例:[1 2 3])を出力し、[0 1 0 2 0 3]を出力したいと思います。

より広い質問: これは、2つの異なるベクター(例: および[9 8 7]が織り交ぜて[9 1 8 2 7 3]を生成する。

上記の質問のいずれか、または両方にご協力いただきまして助けてください。

答えて

8

をお試しください:

nums = rand(1,3) 
output = zeros(1,2*numel(nums)); 
output(2:2:end) = nums 

は、出力は以下の通りである。他の2つの答えのスタイルに続い

nums = 

    0.9134 0.6324 0.0975 


output = 

     0 0.9134   0 0.6324   0 0.0975 

次のようにして、希望のゼロ出力を得ることができます:

nums = rand(1,3); 
reshape([zeros(size(nums));nums],1,[]) 

明らかに、numsは、使用したいベクターに置き換えてください。前述のように、reshapeを呼び出す前に、行ベクトルであることを確認する必要があります。

+1

です。これが行ベクトルであることを保証するには' nums(:) '' – Jonas

+0

' reshape'ソリューションは非常にエレガントです! – Anael

10

ここで何をしたい達成するいくつかのコードです

reshape([[9 8 7];[1 2 3]],1,[]) 
+0

私は本当にこのソリューションが気に入っていますが、ドキュメントを見ると、この関数がすべての入力に対して、または将来の関数の実装でこのように動作するという保証はありません。特に、「reshape(X、SIZ)はXと同じ要素を持つN-D配列を返しますが、サイズSIZに再成形されています」と保証するだけです。 –

+0

@JacobLee: 'reshape'の使用は安全です。最初の引数は1であり、レースホルダーは常に1xnに変形します。 – Daniel

+0

行と列の入力のためのもっと一般的なバージョンは、 'reshape(' A(:)。 '; B(:)。'、1、[]) ' – Daniel

25

私はMATLABベクトルの内部レイアウトを利用しています。列の長さ、すなわち列の値が最も速く変化します。二つのベクトルabをインターリーブするには、単に実行します。

ar = a(:)'; % make sure ar is a row vector 
br = b(:)'; % make sure br is a row vector 
A = [ar;br]; % concatenate them vertically 
c = A(:);  % flatten the result 
+0

簡単ですが、行ベクトルを返すようにするには、もちろん最後の行を変更することもできます: 'c = A(:) ';' –

+2

'' 'の代わりに' .''を使用してください。そうでなければ動作しません複素数で – Daniel

4

を私は正確に何をしたい、よりを行うファイル交換サイト(Interleave Vectors or Matrices)上にあるMATLAB関数を書きました。 .mファイルをダウンロードし、他の.mファイルと同じディレクトリに置くか、関数をコピーしてプログラムに貼り付けてください。

この関数は、任意の数のベクトルまたは行列を行または列でインターリーブします。入力が単なるベクトルの場合、方向を指定する必要はありません。余分な要素/行/列が出力行列の末尾に追加されます。提供される他の答えは、等しい長さのベクトルに非常に特有であり、ベクトルの向きが正しいことを確認する必要があります。関数を使用する方法の

例:入力:

1)行列

A = [1 2; 3 4] B = [5 6;7 8] 

C = interleave2(A, B, 'row') 
C = [1 2 
    5 6 
    3 4 
    7 8] 

2の列をインターリーブ)行列の列

C = interleave2(A, B, 'col') 
C = [1 5 2 6 
    3 7 4 8] 

3)インターリーブベクトル(注インタリーブベクトルは同じ向きである必要はない)

A = [1 2 3 4] B = [5 6 7 8 9]' 
C = interleave2(A, B) 
C = [1 5 2 6 3 7 4 8 9]' 

4)インターリーブ> 2つの行列

A = [1 2;3 4] B = [5 6;7 8] 
C = [9 10;11 12] D = [13 14;15 16] 

E = interleave2(A, B, C, D, 'col') 
E = [1 5 9 13 2 6 10 14 
    3 7 11 15 4 8 12 16] 

5)等しくない列について

A = [1 2;3 4] 
B = [5 6 7 8;9 10 11 12] 
C = interleave2(A, B, 'col') 
C = [1 5 2 6 7 8 
    3 9 4 10 11 12] 

6)インターリーブ>等しくない長さの2つのベクトル

A = [1 2 3 4] B = [5 6 7] 
C = [8 9 10 11 12 13] 
D = interleave2(A, B, C) 
D = [1 5 8 2 6 9 3 7 10 4 11 12 13] 
4

で2つの行列の列をインタリーブ最も単純なケースでは、同様の質問にthis answerで説明されているような1ライナーの非常に「エレガントな」ソリューションがあります。

a = [9 8 7]; 
b = [1 2 3]; 
output = kron(a, [1 0]) + kron(b, [0 1]); 

の回答で述べたように、これはあまり効率的でであることに注意してくださいしかし、それは二つの行列の間で明確に定義されているKronecker productを使用してちょうどインターリーブよりより汎用的のために役立つかもしれません。

関連する問題