矩阵生成八度/ Matlab的,无环溶液请求(Matrix creation Octave / Ma

2019-09-16 16:06发布

我想创建像矩阵

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]

是否有一个无回路的方式来做到这一点?

Answer 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)');


Answer 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)

我不知道这是如何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


Answer 3:

这要求只有一条线路,而且似乎比基于以前的解决方案快repmatarrayfun

%// Example data
ncols = 5;
B = [4 3 3 3 2 1];

%// Generate A
A = bsxfun(@gt, 1:ncols, B(:));


文章来源: Matrix creation Octave / Matlab, loopless solution request