1. ホーム
  2. matlab

[解決済み] MATLABでベクトルの線形スパンを求める

2022-02-14 03:03:20

質問

MATLABで与えられたベクトルのスパンを生成する方法を探しています。

例えば

もし a = [ 0 1 0 1] という形のすべてのベクトルが必要です。 [0 x 0 y] 1 <= x <= max1, 1 <= y <= max2,.

または

a = [ 0 1 0 1 1 0] という形のすべてのベクトルが必要です。 [0 x 0 y z 0] 1 <= x <= max1、1 <= y <= max2、1<= z <= max3.

ベクトルは可変数の1を持つことができることに注意してください。

私の第一印象では、MATLABでそれが可能かどうかわからないが、可変数のforループが必要だろうと思っている。また、他のアイデアも歓迎します。

どのように解決するのですか?

この場合、複数のforループは必要ありません。以下のコードでは、必要なすべてのベクトルを背の高い行列の行として生成しています。これは実際には の行列を1つずつ作成する。各列には1:m(i)の数字が、以下のようなパターンで配置されます。

  • 各項は、m(i)以降のすべてのm個の数値の積に等しい回数だけ繰り返される。
  • パターン全体が, m(i) より前のすべての m-数値の積に等しい回数だけ繰り返される.

これは repmat(kron(1:m(i),ones(1,after)),1,before)' を実行します。(R2015aからは repelem を置き換えることで、これを簡略化することができます。 kron というコマンドがありますが、まだそのリリースはありません)。

a = [0 1 0 1 1 0];
m = [2 4 3];        // the numbers max1, max2, max3 
A = zeros(prod(m), length(a));
i = 1;                           // runs through elements of m 
for j=1:length(a)                // runs through elements of a 
    if (a(j)>0)
        before = prod(m(1:i-1));
        after = prod(m(i+1:end));
        A(:,j) = repmat(kron(1:m(i),ones(1,after)),1,before)';
        i = i+1;
    end
end

出力します。

 0     1     0     1     1     0
 0     1     0     1     2     0
 0     1     0     1     3     0
 0     1     0     2     1     0
 0     1     0     2     2     0
 0     1     0     2     3     0
 0     1     0     3     1     0
 0     1     0     3     2     0
 0     1     0     3     3     0
 0     1     0     4     1     0
 0     1     0     4     2     0
 0     1     0     4     3     0
 0     2     0     1     1     0
 0     2     0     1     2     0
 0     2     0     1     3     0
 0     2     0     2     1     0
 0     2     0     2     2     0
 0     2     0     2     3     0
 0     2     0     3     1     0
 0     2     0     3     2     0
 0     2     0     3     3     0
 0     2     0     4     1     0
 0     2     0     4     2     0
 0     2     0     4     3     0