16

MATLAB で 2 つのベクトルを織り交ぜたいと考えています。実際には、各要素の間にゼロを追加したいのですが、これを他の状況に適用する方法を学ぶような方法で質問をすることにしました.

[1 2 3]私の特定のアプリケーション: ベクトル (例: ) と outputを取得したいと思います[0 1 0 2 0 3]

[1 2 3]より広い質問: 2 つの異なるベクトルを使用し[9 8 7]てこれを行うにはどうすればよいでしょうか[9 1 8 2 7 3]

上記の質問のいずれかまたは両方で、どんな助けでも大歓迎です。

4

6 に答える 6

30

MATLAB ベクトルの内部レイアウトを利用します。これらは列優先で格納されます。つまり、列の値が最も速く変化します。a2 つのベクトルとをインターリーブするにbは、次のようにします。

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
于 2012-04-25T13:10:11.833 に答える
12

試す

reshape([[9 8 7];[1 2 3]],1,[])
于 2012-04-25T13:09:34.060 に答える
9

これは、あなたが望むものを達成するいくつかのコードです:

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

出力は次のとおりです。

nums =

    0.9134    0.6324    0.0975


output =

         0    0.9134         0    0.6324         0    0.0975

他の2つの回答のスタイルに従って、次のようにして目的のゼロ出力を得ることができます:

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

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

于 2012-04-25T13:10:01.893 に答える
4

最も単純なケースでは、同様の質問に対するこの回答で説明されているように、ワンライナーを使用した非常に「エレガントな」ソリューションがあります。

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

回答で述べたように、これは効率が悪いことに注意してください。ただし、2 つのマトリックス間で明確に定義されたクロネッカー積を使用するため、単にインターリーブするよりも一般的な目的に役立つ可能性があります。

于 2014-12-10T22:24:13.073 に答える
4

File Exchange サイト ( Interleave Vector 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) 列が等しくない 2 つの行列の列をインターリーブする

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]
于 2014-05-09T17:21:31.450 に答える