MATLABのVector to Matrix構文
質問
MATLABで次のような2つのベクトルを結合する方法はありますか
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
次のような通常のMATLAB構文を使用します。
mat = C * S(1:length(S))
これにより、「内部マトリックスの次元はエラーに一致する必要があります」通常の行列演算を実行しようとしているためです。これは標準の線形代数演算ではないため、MATLABで正しく表現する方法はわかりませんが、MATLABでは非常に遅いループを必要とせずに実行できるはずです。
解決
あなたの説明から、それは単純な行列演算のように聞こえます。 C と S に適切なサイズを確保する必要があります。 C は列ベクトル( length(C)行1列)であり、 S は行ベクトル(1行< strong> length(S))。それらが正しい寸法であると仮定して、次のことを行ってください:
mat = C*S;
寸法がわからない場合、これは機能するはずです:
mat = (C(:))*(S(:)');
編集:実際、私は括弧に少し夢中になりました。いくつかは、操作の順序に関する懸念がないため、不要です。クリーンバージョンを次に示します。
mat = C(:)*S(:)';
説明:
MATLABの行列乗算演算子 内部製品(結果はスカラー値)または外部製品(マトリックスになります)は、適用されるベクトルの次元に依存します。
上記の最後の式は、コロン演算子を使用して、ベクトル引数の次元を変更します。構文 C(:)は、 C の内容を単一の列ベクトルに変形します。構文 S(:) 'は、 S の内容を列ベクトルに変形し、行ベクトルに転置します。乗算すると、サイズ( length(C) x length(S))のマトリックスになります。
注:このコロン演算子の使用は、任意の次元のベクトルと行列に適用でき、その内容を単一の列ベクトルに変更できます(これにより、< a href = "https://stackoverflow.com/questions/709872/multi-dimension-any">他のSO質問)。
他のヒント
MATLABでこれを実行してみてください:
mat = C*S'
As In:
C = [1; 2; 3];
S = [2; 2; 9; 1];
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
% Equivalent code:
mat2 = C*S';
myDiff = mat - mat2
次の意味ですか?
mat = zeros(length(C),length(S));
for j=1:length(C)
mat(j,:)=C(j)*S;
end
もしそうなら、それは単に行列の乗算です:
C' * S % if C and S are row vectors
C * S' % if C and S are column vectors
C
と S
が行ベクトルなのか列ベクトルなのかわからない場合は、トリックを使用してそれらを列ベクトルに変換してから、 S
を乗算する前に:
C(:) * S(:)'
あなたが何をしているのか完全にはわかりません-結果のマトリックスは length(C)
行で構成され、 i
番目の行 C
の i
番目のエントリでスケーリングされたベクトル S
です(ベクトルの添字付けによりスカラーが得られるため)。この場合、次のようなことができます
mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])
列全体で C
をタイル表示し、 S
で行をタイル表示します。
これを試してください:
C = 1:3 S = 1:5 mat1 = C '* S
mat2 = bsxfun(@times、C '、S)
(必要な関数がより単純なMATLAB表記ではない場合は特に良い)
-ローレン
meshgridを使用してみてください:
[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;
編集:気にしないで、行列の乗算も行います。 1つの列ベクトルCと1つの行ベクトルSが必要です。その後、C * Sを実行します。