2017-12-06 5 views
2

MATLABベクトル化を使用して2つのベクトルから特定の行列を生成する効率的な方法があるかどうかを知りたかったのです。ベクトル化を使用して2つのベクトルから特定の行列出力を得る

は、ベクトルはU、V、A1、A2、A3、B1、B2、B3は、いくつかの実数である

x = [u v] 

y = [a1 a2 a3 b1 b2 b3] 

あると仮定します。

Iは、これらのベクターを使用して生成したい2列の行列は、一般に

M = [u a1; 
    u a2; 
    u a3; 
    v a1; 
    v a2; 
    v a3; 
    u b1; 
    u b2; 
    u b3; 
    v b1; 
    v b2; 
    v b3] 

あり、xの長さは何とyの長さとすることができる。ここで3の倍数であるコードであります私は今持っているが、私はいくつかのより良い方法(おそらくforループの使用を避けること)があっべきだと思います:

M = []; 
Y = reshape(y, 3, []); 

for j = 1:size(Y, 2) 
    [a, b] = meshgrid(x, Y(:, j)); 
    L = [a(:) b(:)]; 
    M = [M; L]; 
end 
+1

これは非常にあいまいです。あなたのマトリックスの実際の要件は何ですか?どのように一般的にこれをしようとしていますか?あなたはこれを自分で解決するために何かをしましたか? –

+0

問題の説明をより明確に編集しました。 – adas

答えて

2

repmatrepelemを用いて溶液:

M = [repmat(repelem(x(:),3),numel(y)/3,1) , ... 
reshape(repmat(reshape(y,3,[]),numel(x),1),[],1)]; 
+1

これに相当するOctaveコードへのIDEOneリンクはhttps://ideone.com/n5U33oです。これは、欠けている 'repeatlem'関数を回避するための小さな調整があります。 –

+0

[repeepms](https://octave.sourceforge.io/octave/function/repelems.html)も役立ちます。 – rahnema1

+0

もちろん、IDEOneのオクターブはそれをまだサポートしていません。 –

0

はあなたがM.ではかなり奇妙な順序が重要そのためですか?そうでない場合、または後で自分でオーダーを修正するために満足している場合、私は2つのソリューションを持っている:

1)をコード

[a,b] = meshgrid(x,y); 
M = [a(:) b(:)] 

はあなたを与える:

M = [ 
u a1 
u a2 
u a3 
u b1 
u b2 
u b3 
v a1 
v a2 
v a3 
v b1 
v b2 
v b3] 

2 )コードM = combvec(x, y)'はあなたに与えます:

M = [ 
u a1 
v a1 
u a2 
v a2 
u a3 
v a3 
u b1 
v b1 
u b2 
v b2 
u b3 
v b3] 
+0

最終回答はどのようにして得られますか?なぜあなたは質問の順序が間違っていると思いますか? –

+0

しかし、OPが望むものと一致しない2つの行列を生成し、そのうちの1つがうまくいくはずであることを暗示します。 –

+1

いずれのソリューションも正しい最初の列を提供しません。 –

関連する問題