Matlab - 使用另一个向量作为限制创建向量

时间:2014-11-08 19:03:47

标签: matlab vector

说我有以下列vector Z

 1  53  55  57  60  64  68  70  71  72  74  76  77  78  79  80  255

我想用它来创建一个矩阵,使每行包含Z

中2个相邻元素之间的所有数字(包括)

所以输出矩阵应该是这样的:

1 2 3 .... 53
53    54   55
55    56   57
57    58   60
....
80  81 ... 255

我一直在寻找类似但却找不到的东西。

由于

2 个答案:

答案 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循环进行比较。比较两个提出的解决方案:

enter image description here enter image description here

用于测试的代码:

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

我之前遇到过循环更快的其他任务。 (或者我搞砸了比较?)