0

不知道该怎么做,这真的让我发疯。我有一个大矩阵,有 3 列显示:

  1. 当年销售的物品数量
  2. 商品售出的第一年
  3. 去年这些物品已售出。

因此,在以下示例中,2000 年至 2010 年间每年售出 13 件商品,而 2003 年和 2004 年售出 44 件:

Matrix_A = {13,    2000,    2010;
            44,    2003,    2004}

我试图按年份分开这些值,以计算每年售出的物品总数。因此,2003 年和 2004 年将售出 57 (13 + 44) 件商品,其他年份将售出 13 件。

生成的矩阵如下所示:

{13, 2000;
 13, 2001;
 13, 2002;
 13, 2003;
 13, 2004;
 13, 2005;
 13, 2006;
 13, 2007;
 13, 2008;
 13, 2009; 
 13, 2010;
 44, 2003;
 44, 2004}

我尝试为每年创建一个单独的空矩阵,循环遍历 Matrix_A 并将行分配给适当的年度矩阵。因此,对于 Matrix_A:

  • 13 将添加到 2000 年至 2010 年的矩阵中,并且,
  • 44 到 2003 年和 2004 年的矩阵。

但这似乎涉及动态变量名,我无法实现。

总之,我迷路了。有任何想法吗?

谢谢!

4

3 回答 3

2

这是生成您在问题中显示的矩阵的数据集的简单循环

B = [];
A = [13,    2000,    2010;
     44,    2003,    2004];

for i=1:size(A,1)
    years = [A(i,2):A(i,3)]';
    start = size(B, 1);
    B(start+1:start+numel(years),2) = years;
    B(start+1:start+numel(years),1) = A(i,1);
end
B =

      13        2000
      13        2001
      13        2002
      13        2003
      13        2004
      13        2005
      13        2006
      13        2007
      13        2008
      13        2009
      13        2010
      44        2003
      44        2004
于 2012-10-25T13:40:45.710 回答
0

您可以使用 MATLAB 的矩阵索引功能来完成此操作。无论您拥有多少年或产品,这种方法都应该有效。

A = [13,2000,2010;44,2003,2004];
%# grab the earliest year in your matrix
firstYear = min(A(:,2));
%# grab the last year in your matrix
lastYear = max(A(:,3));
%# create a list of all years
years = firstYear:lastYear;
%# initialize the product sum for each year
productTotals = zeros(size(years));
% loop through and add up your totals
for yy = 1:numel(years)
for aa = 1:size(A,1)
%# check to see if the product was sold that year
if years(yy)>=A(aa,2) && years(yy)<=A(aa,3)
productTotals(yy) = productTotals(yy) + A(aa,1);
end
end
end
于 2012-10-25T13:50:42.950 回答
0

为什么每年都需要单独的矩阵?

你可以有一个数组,它的每个元素代表一年。第一个元素是第一年(第二列的最小值)。

编辑:使用 s 对非标量元素也可以做到这一点cell(见下面的评论)

于 2012-10-25T13:41:27.650 回答