我想创建像矩阵
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]
基于表示多少“0'应当先”在每行1的载体:
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]
基于表示多少“0'应当先”在每行1的载体:
B = [4 3 3 3 2 1]
是否有一个无回路的方式来做到这一点?
你不会在你的问题提到如何阵列的横向尺寸,应定义(一的数量)。
对于预先定义的宽度,你可以使用此代码:
width = 5;
A = cell2mat(arrayfun(@(x) [ zeros(1,x), ones(1,width-x) ], B, 'UniformOutput', false)');
如果你想A有最小宽度,但仍每一行中的至少一个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)
我不知道这是如何speedwise比较@ NRZ的做法(我只带了八度,现在出手),但对我来说更直观的,因为它是简单地比较一个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:最大(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
这要求只有一条线路,而且似乎比基于以前的解决方案快repmat
或arrayfun
:
%// Example data
ncols = 5;
B = [4 3 3 3 2 1];
%// Generate A
A = bsxfun(@gt, 1:ncols, B(:));