- 帖子
- 186
- 主題
- 6
- 精華
- 0
- 積分
- 218
- 點名
- 0
- 作業系統
- win7
- 軟體版本
- office 2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2012-11-12
- 最後登錄
- 2014-4-15
|
7#
發表於 2013-6-4 14:24
| 只看該作者
本帖最後由 Bodhidharma 於 2013-6-4 14:30 編輯
回復 6# ML089 - =IF(A2="","",MAX(MMULT(TRANSPOSE(((COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)>=E$2:E2)*((COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)<=F$2:F2)),E$2:E2^0)))
複製代碼 這個公式真是了不起,我當初也試圖寫類似的東西,但是怎麼都轉不過來,所以只好僅處理最後一個輸入的資料
筆記:- COLUMN(INDIRECT("C1:C"&F2-E2+1,))
複製代碼 :使用R1C1格式,會得出{1,2,3…n}的1*n單列矩陣,n=該日期區間的天數,再+E2-1,即是該日期區間所有日期的單列矩陣- (COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)>=E$2:E2
複製代碼 ,前面是單列矩陣,後面是單欄矩陣,假設該公式下拉到第k+1列,即會是{Day1,Day2,…,Dayn}>={E2;E3;…;Ek+1},會得出一個k列n欄的矩陣,{X11,X12,…,X1n;X21,X22,…,X2n;X31,…,;…Xk1,Xk2,…Xkn}
Xkn的值即是「該日期區間的第n天,是否大於等於(從前往後算)第k個開始日期」- COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)<=F$2:F2
複製代碼 一樣的道理,得出k列n欄的矩陣{Y11,Y12,…,Y1n;Y21,Y22,…,Y2n;Y31,…,;…Yk1,Yk2,…Ykn}
Ykn的值即是「該日期區間的第n天,是否小於等於(從前往後算)第k個結束日期」
X*Y得出{Z11,Z12,…,Z1n;Z21,Z22,…,Z2n;Z31,…,;…Zk1,Zk2,…Zkn},Zkn即是「該日期區間的第n天,是否存在於(從前往後算)第k個日期區間中」
現在需要{Z11+Z21+…+Zk1,Z12+Z22+…+Zk2,…,Z1n+Z2n+…+Zkn}的矩陣,就是「該日期區間的第n天,在(從前往後算)第k個日期區間中出現的次數」如果這n個值中有任意一個大於3,即不符合驗證標準。
要製造這個矩陣有兩種方式,一種是製造一個1*k的單位矩陣跟k*n的Z矩陣相乘,即可得出單列矩陣,也就是- MMULT(TRANSPOSE(E$2:E2^0),((COLUMN(INDIRECT("C1:C"&F4-E4+1,))+E4-1)>=E$2:E4)*((COLUMN(INDIRECT("C1:C"&F4-E4+1,))+E4-1)<=F$2:F4))
複製代碼 另外一種方式是先將k*n的Z矩陣轉置為n*k,再乘一個k*1的單位矩陣,則會得出一個單欄矩陣。因為我們需要的只是矩陣的最大值,因此單列矩陣或單欄矩陣都可以,因此就有原公式- MAX(MMULT(TRANSPOSE(((COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)>=E$2:E2)*((COLUMN(INDIRECT("C1:C"&F2-E2+1,))+E2-1)<=F$2:F2)),E$2:E2^0))
複製代碼 有種把高中矩陣乘法重新拿出來溫習的感覺…… |
|