2016-08-05 106 views
2

我用这个子程序,创建大小为N如何使用Excel VBA创建标识矩阵?

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 

有没有更好的办法的单位矩阵?简单的一个可能?

+1

我认为这个问题应该转移到http://codereview.stackexchange.com – NatNgs

回答

1

试试这个

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

为什么downvote?请小心解释我的答案有什么问题?谢谢... –

2

从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用零开始(我们可以零:)

+0

如果寻找“小&快”的代码,为什么'整数'?它比'Long'更加昂贵...仍然:只使用'0'和'1',即使是'Byte'也足够了:P –

+0

@DirkReichel:用'Byte'返回一个错误 –

+0

“足够“......不幸的是,它试图将数组更改为一个字符串,因此无法正常工作:/ –

1

为了获得无环的快速子,只是使用这样的东西:

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

这只在以A1或B2或E5开头时才起作用:-) –

+0

@iDevlop haha​​ ... true ...已更改那...... thx bro^o ^; –

0

其实,有一个内置函数,MUNIT。只需选择您想要的NxN单元格,输入=MUNIT(dimension)并按CTRL+Shift+Enter即可。或者您可以在第一个单元格中键入公式,然后按F2,选择NxN单元格并按CTRL+Shift+Enter

PS。我知道OP可能不会看到这个,但也许别人会这样做。