连续'N'次重复值,然后递增值 - Matlab(变化N)

时间:2012-03-26 21:21:48

标签: matlab matrix

我有一个矩阵:

mat = [  2009 3 ;
         2010 2 ] ;

我需要按照Col2重复Col1。 Repeat copies of array elements: Run-length decoding in MATLAB的解决方案很有帮助。但是,我的主要问题是随后增加年份,如:

Ansmat = [  2009 3
            2010 3
            2011 3
            2010 2
            2011 2 ] ;

我想在这里避免for循环。谢谢你的帮助!这将是一个很大的帮助!

3 个答案:

答案 0 :(得分:2)

您可以先使用my vectorized answer to the previous question复制矩阵:

>> mat = [2009 3; 2010 2];
>> index = zeros(1, sum(mat(:, 2)));
>> index([1; cumsum(mat(1:end-1, 2))+1]) = 1;
>> Ansmat = mat(cumsum(index), :)

Ansmat =

        2009           3
        2009           3
        2009           3
        2010           2
        2010           2

接下来,您可以创建偏移的列向量以添加到第一列中的日期。以下是如何以矢量化方式执行此操作。

>> offset = ones(size(Ansmat, 1), 1);
>> offset([1; cumsum(mat(1:end-1, 2))+1]) = [0; 1-mat(1:end-1, 2)];
>> Ansmat(:, 1) = Ansmat(:, 1)+cumsum(offset)

Ansmat =

        2009           3
        2010           3
        2011           3
        2010           2
        2011           2

答案 1 :(得分:0)

我不确定是否有办法在没有循环的情况下执行此操作,因为这是我们正在执行的一个有点模糊的操作。如果我正确理解你的算法,这里有两种使用单for循环的方法:

B = zeros(sum(A(:,2)), 2);
counter = 1;
for i = 1:size(A,2)
    n = A(i,2);
    B(counter:counter+n-1,1) = A(i,1)+(0:n-1)';
    B(counter:counter+n-1,2) = n;
    counter = counter+n;
end

你可以取消预分配。如果counter变量令人困惑,那么你可以查看这个变量,每次迭代都会附加矩阵B但是需要一个初始起始情况。

n = A(1,2);
B = [A(1,1)+(0:n-1)', n*ones(n,1)];
for i = 2:size(A,2)
    n = A(i,2);
    B = [B; A(i,1)+(0:n-1)', n*ones(n,1)];
end

答案 2 :(得分:0)

incr = (0 : max(mat(:, 2)))';
incr = [incr, 0 * incr];
Ansmat = [];
for k = 1 : size(mat, 1)
    Ansmat = cat(1, Ansmat, repmat(mat(k, :), mat(k, 2), 1) + incr(1 : mat(k, 2), :));
end

但是如果矩阵Ansmat的预期大小很大,GummiV的第一个解决方案会更快。