重复一行中的值';N';次数,然后增加值-Matlab(变化N)

重复一行中的值';N';次数,然后增加值-Matlab(变化N),matlab,matrix,Matlab,Matrix,我有一个矩阵: mat = [ 2009 3 ; 2010 2 ] ; 我需要按照Col2重复Col1。此时的解决方案很有帮助。然而,我的主要问题是根据以下情况增加年份: Ansmat = [ 2009 3 2010 3 2011 3 2010 2 2011 2 ] ; 我想在这里避免for循环。谢谢你的帮助!这将是一个很大的帮助 我不确定是否有一种不使用循环的方法来实现这一

我有一个矩阵:

mat = [  2009 3 ;
         2010 2 ] ;
我需要按照Col2重复Col1。此时的解决方案很有帮助。然而,我的主要问题是根据以下情况增加年份:

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

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

我不确定是否有一种不使用循环的方法来实现这一点,因为我们正在执行的操作有些晦涩。如果我正确理解了您的算法,这里有两种方法使用单个
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
你可以取消预分配。如果
计数器
变量令人困惑,那么您可以检查这个变量,它在每次迭代中都会附加矩阵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

但是,如果matrix Ansmat的预期尺寸较大,GummiV的第一个解决方案将更快。

您可以首先使用以下方法复制矩阵:

接下来,可以创建偏移量的列向量,以添加到第一列中的日期。以下是如何以矢量化的方式实现这一点

>> 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

哇,这是一个非常聪明和聪明的方式,荣誉:)一个小的修正;因此,这适用于两行以上的矩阵,您需要将mat(1:end-1,2)转置到[1…]上下文中使用它的三个位置。@GummiV:很好。我添加了一些分号来纠正较大矩阵可能出现的维度不匹配。@Gnovice谢谢。我注意到了GummiV提到的错误,并用简单的方法纠正了它;谢谢……这真是又快又聪明:)
>> 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