矩阵创建倍频程/Matlab,无环解决方案请求

矩阵创建倍频程/Matlab,无环解决方案请求,matlab,matrix,octave,vectorization,Matlab,Matrix,Octave,Vectorization,我想创建一个矩阵,比如 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] 有没有一种无环的方法可以做到这一点?您在问题中没有提到应该如何定义数组的水平大小(一个数) 对于预定义的宽度,可以使用以下代码: width = 5; A = cell2mat(ar

我想创建一个矩阵,比如

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]

有没有一种无环的方法可以做到这一点?

您在问题中没有提到应该如何定义数组的水平大小(一个数)

对于预定义的宽度,可以使用以下代码:

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)
具有[1:最大(B)+最小值]的行平铺

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(:));

这比我的方法(至少在R2011b上)快6-7倍。在我的笔记本电脑上
tic;对于i=1:100000;A=cell2mat(arrayfun(@(x)[零(1,x),一(1,最大值(B)+1-x)],B,'UniformOutput',false');结束;toc大约需要35秒,而@RROWWLLAANNDD的code
min_ones=1;抽搐;对于i=1:100000;A=重复(B',1,最大值(B)+最小值)
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
%// Example data
ncols = 5;
B = [4 3 3 3 2 1];

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