如何使用Excel VBA创建标识矩阵?

如何使用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

我使用这个子程序创建了一个大小为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
            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开始时才起作用的问题:-)