如何在 Excel 中向量化和取消向量化?
How to Vectorize and Unvectorize in Excel?
假设一个 Excel 文件逐行向量化了 2×2 对称矩阵,如下所示:
line
A: element11
B: element22
C: element12=element21
D: DETERMINANT
1
2
3
0
6
2
5
7
0
35
3
11
13
0
143
…
…
…
…
…
因此,DETERMINANT 列的第一个值可以从矩阵 {2 0,0 3} 计算,第二个值可以从矩阵 {5 0,0 7} 计算,依此类推。 D1 值可以通过 =MDETERM(IF(A1:B1=TRANSPOSE(A1:B1),A1:B1,C1))
直接计算,而不是重塑 A1:C1 值,因为 IF
实际上可以将 A1:C1 值重塑为感兴趣的对角矩阵。
重点在于,在Excel中,MDETERM
等矩阵函数直接需要矩阵,而数据中的矩阵是向量化后逐行存储的。不幸的是,上面的 IF
解决方案只能重塑 2×2 对称矩阵,并且既不能处理非对称矩阵,也不能处理具有两个以上非对角线元素的矩阵。我们是否有比图示的 IF
方法更通用的解向量化矩阵的其他解决方案?
此外,我也对 Excel 中的向量化矩阵感兴趣;例如,A1:C1 中的矩阵可以在 D1:G1 区域中进行整形、反转和恢复。感谢您的帮助!
我想你的意思可能是
=IF(COLUMN(A1:B1)=TRANSPOSE(COLUMN(A1:B1)),A1:B1,C1)
但是你当然可以扩展这个想法。假设您在 A1:D1 中有对称 4X4 矩阵的对角线元素,在 E1:J1 中有非对角线元素。
那么你可以使用
=IF(ROW(A1:D4)=COLUMN(A1:D4),INDEX(A1:J1,ROW(A1:D4)),
IF(ROW(A1:D4)<COLUMN(A1:D4),INDEX(E1:J1,(ROW(A1:D4)-1)*4+COLUMN(A1:D4)-ROW(A1:D4)*(ROW(A1:D4)+1)/2),
INDEX(E1:J1,(COLUMN(A1:D4)-1)*4+ROW(A1:D4)-COLUMN(A1:D4)*(COLUMN(A1:D4)+1)/2)))
使用 Excel 365 Let 函数更通用:
=LET(N,4,mat,A1:INDEX(A1:Z26,N,N),
IF(ROW(mat)=COLUMN(mat),
INDEX(1:1,ROW(mat)),
IF(ROW(mat)<COLUMN(mat),
INDEX(1:1,(ROW(mat)-1)*N+COLUMN(mat)-ROW(mat)*(ROW(mat)+1)/2+N),
INDEX(1:1,(COLUMN(mat)-1)*N+ROW(mat)-COLUMN(mat)*(COLUMN(mat)+1)/2+N))))
假设一个 Excel 文件逐行向量化了 2×2 对称矩阵,如下所示:
line | A: element11 | B: element22 | C: element12=element21 | D: DETERMINANT |
---|---|---|---|---|
1 | 2 | 3 | 0 | 6 |
2 | 5 | 7 | 0 | 35 |
3 | 11 | 13 | 0 | 143 |
… | … | … | … | … |
因此,DETERMINANT 列的第一个值可以从矩阵 {2 0,0 3} 计算,第二个值可以从矩阵 {5 0,0 7} 计算,依此类推。 D1 值可以通过 =MDETERM(IF(A1:B1=TRANSPOSE(A1:B1),A1:B1,C1))
直接计算,而不是重塑 A1:C1 值,因为 IF
实际上可以将 A1:C1 值重塑为感兴趣的对角矩阵。
重点在于,在Excel中,MDETERM
等矩阵函数直接需要矩阵,而数据中的矩阵是向量化后逐行存储的。不幸的是,上面的 IF
解决方案只能重塑 2×2 对称矩阵,并且既不能处理非对称矩阵,也不能处理具有两个以上非对角线元素的矩阵。我们是否有比图示的 IF
方法更通用的解向量化矩阵的其他解决方案?
此外,我也对 Excel 中的向量化矩阵感兴趣;例如,A1:C1 中的矩阵可以在 D1:G1 区域中进行整形、反转和恢复。感谢您的帮助!
我想你的意思可能是
=IF(COLUMN(A1:B1)=TRANSPOSE(COLUMN(A1:B1)),A1:B1,C1)
但是你当然可以扩展这个想法。假设您在 A1:D1 中有对称 4X4 矩阵的对角线元素,在 E1:J1 中有非对角线元素。
那么你可以使用
=IF(ROW(A1:D4)=COLUMN(A1:D4),INDEX(A1:J1,ROW(A1:D4)),
IF(ROW(A1:D4)<COLUMN(A1:D4),INDEX(E1:J1,(ROW(A1:D4)-1)*4+COLUMN(A1:D4)-ROW(A1:D4)*(ROW(A1:D4)+1)/2),
INDEX(E1:J1,(COLUMN(A1:D4)-1)*4+ROW(A1:D4)-COLUMN(A1:D4)*(COLUMN(A1:D4)+1)/2)))
使用 Excel 365 Let 函数更通用:
=LET(N,4,mat,A1:INDEX(A1:Z26,N,N),
IF(ROW(mat)=COLUMN(mat),
INDEX(1:1,ROW(mat)),
IF(ROW(mat)<COLUMN(mat),
INDEX(1:1,(ROW(mat)-1)*N+COLUMN(mat)-ROW(mat)*(ROW(mat)+1)/2+N),
INDEX(1:1,(COLUMN(mat)-1)*N+ROW(mat)-COLUMN(mat)*(COLUMN(mat)+1)/2+N))))