2

次のようなマトリックスを作成したい

A = [0 0 0 0 1;
     0 0 0 1 1;
     0 0 0 1 1;
     0 0 0 1 1;
     0 0 1 1 1;
     0 1 1 1 1]

各行で「1」の前に「0」がいくつあるかを示すベクトルに基づいています。

B = [4 3 3 3 2 1]

これを行うループレスな方法はありますか?

4

3 に答える 3

3

質問では、配列の水平サイズをどのように定義する必要があるか (1 の数) について言及していません。

定義済みの幅については、次のコードを使用できます。

width = 5;

A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,width-x) ], B, 'UniformOutput', false)');

A の幅を最小限に抑えたいが、それでもすべての行に少なくとも 1 つの 1 が必要な場合:

A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,max(B)+1-x) ], B, 'UniformOutput', false)');
于 2012-04-21T12:01:10.010 に答える
2

ループなしでこれを達成するためのより短い「昔ながらの」方法は次のようになります。

A = repmat(B',1,max(B)+1)<repmat([1:max(B)+1],size(B,2),1)

最小数にしたい場合

min_ones=1; %or whatever
A = repmat(B',1,max(B)+min_ones)<repmat([1:max(B)+min_ones],size(B,2),1)

これが@nrzのアプローチと速度的にどのように比較されるかはわかりませんが(現在、Octaveしか手に入れていません)、max(B) + min_onesBの*列のタイリングを単純に比較しているのでより直感的です。

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

[1:max(B)+min_ones]の行タイリング

1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5

引き起こす:

A =

  0  0  0  0  1
  0  0  0  1  1
  0  0  0  1  1
  0  0  0  1  1
  0  0  1  1  1
  0  1  1  1  1
于 2012-04-21T17:41:44.767 に答える