如何使用Excel VBA创建标识矩阵?
我使用这个子程序创建了一个大小为N的单位矩阵如何使用Excel VBA创建标识矩阵?,excel,vba,Excel,Vba,我使用这个子程序创建了一个大小为N的单位矩阵 Sub IdMatrix() Dim i As Integer, j As Integer, N As Integer N = 5 For i = 1 To N For j = 1 To N If i = j Then Cells(i, j) = 1 Else Cells(i, j) = 0
Sub IdMatrix()
Dim i As Integer, j As Integer, N As Integer
N = 5
For i = 1 To N
For j = 1 To N
If i = j Then
Cells(i, j) = 1
Else
Cells(i, j) = 0
End If
Next j
Next i
End Sub
有更好的办法吗?可能是一个简单的吗?试试这个
Sub IdMatrix1()
Dim N As Long, i As Long
N = 5: Range("A1").Resize(N, N) = 0
For i = 0 To N - 1
Range("A1").Offset(i, i) = 1
Next
End Sub
下面是另一种创建身份矩阵的奇怪方法
Sub IdMatrix2()
Dim i As Long, N As Long
N = 5: Range("A1").Resize(N, N) = 0
For Each cell In Range("A1").Resize(N, N)
i = i + 1: cell(i) = 1: If i > N - 1 Then Exit For
Next
End Sub
为了获得最佳性能,请使用受iDevlop答案启发的代码
Const N = 5 'Put this constant on top of code editor
Sub IdMatrix3()
Dim IdMx(1 To N, 1 To N) As Long, i As Long
For i = 1 To N: IdMx(i, i) = 1: Next
Cells(1,1).Resize(N, N) = IdMx
End Sub
从VBA访问工作表的成本很高。在数组中创建结果应该更快:
Sub idMatrix()
Dim n As Integer, i As Integer, a() As Integer
n = 5
ReDim a(1 To n, 1 To n)
For i = 1 To n
a(i, i) = 1
Next i
Range("a1").Resize(n, n) = a
End Sub
请注意,将()定义为
Integer
会用零启动它(我们可以是零:)要获得没有循环的快速子对象,只需使用如下方法:
Sub test()
Dim N As Long
N = 5
With [A1].Resize(N, N) '<- do not change this A1
[A1].Resize(N, N).Value2 = Evaluate("IF(ROW(" & .Address & ")=COLUMN(" & .Address & "),1,0)")
End With
End Sub
子测试()
长
N=5
使用[A1].Resize(N,N)“实际上,有一个内置函数,MUNIT
。只需选择所需的NxN单元格,键入=MUNIT(维度)
,然后按CTRL+Shift+Enter
。或者,您可以在第一个单元格中键入公式,然后按F2键,选择NxN单元格,然后按CTRL+Shift+Enter键
另外,我知道OP可能看不到这一点,但可能其他人会看到。IdMx=Application.MUNIT(size)如果要查找“小而快”的代码,为什么Integer
?它比长的更贵。。。不过:只要使用0
和1
,即使字节也足够了:p对于这种情况,“就足够了”。。。不幸的是,它试图将数组更改为一个字符串,这样就不起作用了:/I我认为这个问题应该转移到只有从A1、B2或E5开始时才起作用的问题:-)