说我有以下列vector Z
1 53 55 57 60 64 68 70 71 72 74 76 77 78 79 80 255
我想用它来创建一个矩阵,使每行包含Z
所以输出矩阵应该是这样的:
1 2 3 .... 53
53 54 55
55 56 57
57 58 60
....
80 81 ... 255
我一直在寻找类似但却找不到的东西。
由于
答案 0 :(得分:2)
看看这是否适合你 -
lens = diff(Z)+1;
mask1 = bsxfun(@le,[1:max(lens)]',lens); %//'
array1 = zeros(size(mask1));
array1(mask1) = sort([1:255 Z(2:end-1)]);
out = array1.'; %//'# out is the desired output
答案 1 :(得分:2)
试着打破bsxfun
:)的单调:
d = diff(Z);
N = max(d)+1;
R = zeros(length(Z)-1,N);
for i = 1:length(Z)-1
R(i,1:1+d(i)) = Z(i):Z(i+1);
end
修改强>
我知道普遍的共识是,总是应该尝试避免Matlab中的循环,但这对于这个例子是否有效?我知道这是一个广泛的问题,所以让我们关注这个特定的问题,并将bsxfun
与JIT循环进行比较。比较两个提出的解决方案:
用于测试的代码:
Z = [1 53 55 57 60 64 68 70 71 72 74 76 77 78 79 80 255];
%[1 3 4, 6];
nn = round(logspace(1,4,10));
tm1_nn = zeros(length(nn),1);
tm2_nn = zeros(length(nn),1);
for o = 1:length(nn)
tm1 = zeros(nn(o),1);
tm2 = zeros(nn(o),1);
% approach1
for k = 1:nn(o)+1
tic
d = diff(Z);
N = max(d)+1;
R = zeros(length(Z)-1,N);
for i = 1:length(Z)-1
R(i,1:1+d(i)) = Z(i):Z(i+1);
end
tm1(k) = toc;
end
%approach 2
for k = 1:nn(o)+1
tic
lens = diff(Z)+1;
mask1 = bsxfun(@le,[1:max(lens)]',lens); %//'
array1 = zeros(size(mask1));
array1(mask1) = sort([1:255 Z(2:end-1)]);
out = array1.';
tm2(k) = toc;
end
tm1_nn(o) = mean(tm1);%sum(tm1);%mean(tm1);%
tm2_nn(o) = mean(tm2);%sum(tm2);%mean(tm2);%
end
semilogx(nn,tm1_nn, '-ro', nn,tm2_nn, '-bo')
legend('JIT loop', 'bsxfun')
xlabel('log_1_0(Number of runs)')
%ylabel('Sum execution time')
ylabel('Mean execution time')
grid on
我之前遇到过循环更快的其他任务。 (或者我搞砸了比较?)