0

それぞれサイズが2つの列ベクトルがあります<nx1>configベクトルには数値721,722,723 and 724のみが含まれlength、サイズのベクトルには<nx1>数値のみが含まれます。サイズの行列Zを作成する必要があり<3x3n>ます。 note:matrices a,b,c and d are each <3x3> matrices.ここでルールを言葉で表現するのは難しいので、最初に例を挙げてみましょう。

length=[1 2 3],config=[721 722 723],a=eye(3),b=ones(3),c=magic(3);

z=[ 1     0     0     2     2     2    24     3    18
    0     1     0     2     2     2     9    15    21
    0     0     1     2     2     2    12    27     6]

つまり、config(i)が722で、length(i)が2の場合、2*matrix_aをz行列に追加します。

私は次のことをしました:

     z=[0 0 0;0 0 0;0 0 0];
    for i=1:3
    [~,col]=size(z);
      if config(i)==721
       z(:,col+[1:3])=length(i)*a
      end
      if config(i)==722
       z(:,col+[1:3])=length(i)*b
      end
      if config(i)==723
       z(:,col+[1:3])=length(i)*c
      end
    end
    z=z(:,4:end)

しかし、より良いループレスのベクトル化された方法はありませんか?

4

1 に答える 1

1

この情報がまだ必要かどうかはわかりませんが、解決策を見つけました。

config = [722 722 723 723 721];
lenght=[3 4 5 6 7];
a=eye(3);b=ones(3);c=magic(3);
d1 = kron( ~rem(config, 721).*lenght, a);
d2 = kron( ~rem(config, 722).*lenght, b);
d3 = kron( ~rem(config, 723).*lenght, c);
result = d1 + d2 + d3;

そして私のデータの結果:

a =

     1     0     0
     0     1     0
     0     0     1

b =

     1     1     1
     1     1     1
     1     1     1

c =

     8     1     6
     3     5     7
     4     9     2

result =

     3     3     3     4     4     4    40     5    30    48     6    36     7     0     0
     3     3     3     4     4     4    15    25    35    18    30    42     0     7     0
     3     3     3     4     4     4    20    45    10    24    54    12     0     0     7
于 2015-10-28T11:33:48.330 に答える