矩阵创建倍频程/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的codemin_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(:));