2012-10-25 160 views
0

不知道如何做到這一點,這真的讓我發瘋。 我有3列顯示大矩陣:Matlab:拆分矩陣

  1. 在今年
  2. 銷售的第一年項目的項目進行了去年的項目共售出售出
  3. 的數量。

所以在下面的例子中,13個項目共售出2000 - 2010年和44之間,每年在2003年和2004年:

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

我試圖通過一年分離出的值來計算每年銷售的物品總數。因此,2003年和2004年將有57(13 + 44)件產品出售,其餘13年將銷售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年

但這似乎涉及動態變量名,我無法實施。

總之,我迷路了。有任何想法嗎?

謝謝!

回答

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

拋出那些在循環中添加塊,這將適用於任何大小的'A'。 – Doresoom

+0

@Doresoom當然。我仍然不確定OP需要什麼,所以這只是一個乾淨,簡單的例子。 – angainor

+1

@angainor,感謝您回覆我並對原文中缺乏明確性的道歉。我真的想創建一個兩列的矩陣,第一列顯示一年中銷售的商品數量(即13或44),第二列顯示這些商品銷售的年份。所以,最終的矩陣將顯示{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 **} –

0

你爲什麼想每年單獨矩陣的矩陣?

你可以有一個數組,每個元素代表一年。第一個元素是第一年(第二列的最小值)。

編輯:同樣可以使用cell S非標元素來完成(見下面的評論)

+0

這是非常真實的,但我真的想逐年將整個矩陣分開。我在這裏展示的例子僅用於說明目的。我的總體矩陣比這個(150列)大得多,我最終需要按年分配分配,這就是爲什麼我要分離它。道歉在我原來的帖子中不清楚。 –

+1

在這種情況下,您可以使用'cell's。這些Matlab結構與數組類似,但可以包含任何內容,包括所需的數組。 請參閱http://www.mathworks.fr/fr/help/matlab/ref/cell.html –

+1

感謝您的回覆 - 我真的很感激它。我嘗試使用單元格,但無法弄清楚如何讓matlab將數據添加到適當的單元格。所以,我建立了每年有一個單獨的單元格,並試圖追加數據。是否有可能有不同長度的細胞?否則,我會不會留下很多零值的行?再次,謝謝! –

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