次のようなマトリックスを作成したい
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]
これを行うループレスな方法はありますか?
次のようなマトリックスを作成したい
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]
これを行うループレスな方法はありますか?
質問では、配列の水平サイズをどのように定義する必要があるか (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)');
ループなしでこれを達成するためのより短い「昔ながらの」方法は次のようになります。
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_ones
Bの*列のタイリングを単純に比較しているのでより直感的です。
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