Các phép tính ma trận trong Excel

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,120
Được thích
24,279
1. Tính tổng ma trận, hiệu ma trận và tích ma trận:

Để tính tổng (hiệu, tích) cho ma trận (VD là 2), bạn cần thực hiện các bước sau:
- Bước 1: Nhập số liệu từng ma trận (ma trận A và B)
- Bước 2: Chọn các khối ô chứa kết quả (bôi đen). Sau đó di chuyển con trỏ đến ô bên trái khối ô.
- Bước 3: Nhập công thức tính, cụ thể như sau
+ Tính tổng: =VùngmatrậnA+VùngmatrậnB
+ Tính hiệu: =VùngmatrậnA-VùngmatrậnB
+ Tính tích: =MMULT(VùngmatrậnA,VùngmatrậnB)
- Bước 4: Nhấn phím Ctrl+Shift+Enter, các phép tính sẽ được thực hiện.


2. Nghịch đảo ma trận:

Để nghịch đảo ma trận, bạn cần thực hiện các bước sau:
- Bước 1: Nhập số liệu cho ma trận trận cần nghịch đảo.
- Bước 2: Chọn các khối ô chứa kết quả (bôi đen). Sau đó di chuyển con trỏ đến ô bên trái khối ô.
- Bước 3: Nhập công thức nghịch đảo ma trận
=MINVERSE(VùngmatrậnA)
- Bước 4: Nhấn phím Ctrl+Shift+Enter, các phép tính sẽ được thực hiện.

Hình ví dụ


 
Chỉnh sửa lần cuối bởi điều hành viên:
Vấn đề này đã đề cập trong diễn đàn, nhưng được gọi là "mảng". Còn bên khối kỹ thuật gọi là "ma trận", nghe có vẻ "chuyên nghiệp" hơn :)
 
3. Giải hệ phương trình tuyến tính bằng ma trận:

Có hệ phương trình Ax=B. Tính ma trận nghịch đảo của A và tính (A-1).B, đó chính là véc tơ X cần tìm.
Ví dụ: hệ phương trình
ax+by= e, cx+dy= f

Để xác định giá trị x,y thì thực hiện như sau:
- Nhập giá trị a, b, c, d vào khối ô (A5:B6)- ma trận A.
- Nhập giá trị e, f vào khối ô (A8:A9)- ma trận B.
- Chọn vùng chứa ma trận nghịch đảo của A (D5:E6). Sau đó tính ma trận nghịch đảo như mục 2.
- Chọn vùng chứa nghiệm x, y (D8:D9). Nhập công thức =MMULT(VungA-1,VungB), sau đó nhấn phím Ctrl+Shift+Enter. Nghiệm x, y sẽ xuất hiện.
Bạn có thể kiểm tra lại nghiệm bằng cách tính mà trận Ax rồi so sánh với véc tơ B.
Từ ví dụ trên, bạn có thể giải hệ phương trình có nhiều nghiệm.
Chúc thành công! :_
Hình anh minh hoạ kèm theo

hình minh họa
aaa.jpg
 
Lần chỉnh sửa cuối:
Bác nào quan tâm đến các phép toán ma trận trong excel thì có thể liên hệ với anh daoduy bên ketcau.com. Anh Duy co 1 file *.xla rất hay, khoảng 120 hàm về ma trận, lại ko có pass bảo vệ. Tha hồ mà cày xới.
 
HAiNV đã viết:
. . . . Anh Duy co 1 file *.xla rất hay, khoảng 120 hàm về ma trận, lại ko có pass bảo vệ. Tha hồ mà cày xới.
Rất hay nếu bạn liên hệ giúp; Nghe nó`i đến hơn trăm hàm thì quả là bữa tiệt no nê đây;
Tò mò muốn hỏi trước HAINV là có cách giải hệ loại này không:
2aX + 3(a-b)Y = 4
bX - (a -1 ) Y = a
 

File đính kèm

  • NhanMaTran.rar
    62.3 KB · Đọc: 4,187
em không đem theo usb và máy hàng net cũng không cài excel. em hỏi nhanh 1 phát:
em tham khảo các hàm nhưng chưa tìm được phép chuyển vị ma trận.
anh nào hướng dẫn em chút.

em định làm bằng cách chuyển 1 vùng( là matrix) từ dọc sang ngang.
 
ok. em làm xong hàm này rồi, chuyển vị vô tư, giữ nguyên công thức và tham chiếu đến các ô.
chỉ việc chọn vùng theo chuột và xoay nó là xong.
 
cho tui đóng góp, khi chuyển vị ma trận thì copy vùng rồi chọn paste special/transpose
nếu ma trận chuyển vị có công thức thì cho dùng tọa độ tuyệt đối rồi chọn them formulas.
cho tui thấy nó rất hữu ích cho bạn nào chuẩn bị thi môn cơ kết cấu 3 trường dhxd. cám ơn mọi người.
 
Lần chỉnh sửa cuối:
em đã đọc nhiều bài về nhân ma trận nhưng vẫn không thấy có bài nào viết về cách nhân nhiều ma trận cùng 1 lúc. Em toàn phải nhân 2 matrận rồi nhân tiếp đến matrận khác ...
Có bác nào biết cách nhân nhiều matrận cùng lúc chỉ cho em với. Em cảm ơn
 

File đính kèm

  • matrix18.zip
    977.6 KB · Đọc: 968
Lần chỉnh sửa cuối:
Có ai có thể rút gọn được hàm này không? Em nhìn vào muốn tẩu hỏa luôn.-+*/
Tác giả: Le Viet Thanh
Nguồn: http://www.ketcau.com/forum/showpost.php?p=9591&postcount=87
'DOAN CHUONG TRINH TINH TOAN CAC GIA TRI RIENG CUA MTRAN
'HOAN THANH NGAY 05/03/2003. Trong ham nay khong xet den phan ao cua cac gia tri rieng
Private Sub Balanc(A() As Double, ByVal n As Integer)
Const RADIX = 2
Dim last As Integer, i As Integer, j As Integer
Dim s As Double, r As Double, g As Double
Dim f As Double, c As Double, sqrdx As Double
DoEvents: If mdl01.tiep_tuc = False Then Exit Sub
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Transform to Balanc matric)"
frmSTATUS.ProgressBar1.max = n
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
sqrdx = RADIX * RADIX
last = 0
While last = 0
frmSTATUS.ProgressBar1.Value = frmSTATUS.ProgressBar1.Value + 1
last = 1
For i = 1 To n
r = 0
c = 0
For j = 1 To n
If Not (i = j) Then
c = c + Abs(A(j, i))
r = r + Abs(A(i, j))
End If
Next
If (c And r) Then
g = r / RADIX
f = 1
s = c + r
Do While c < g
f = f * RADIX
c = c * sqrdx
Loop
g = r * RADIX
While c > g
f = f / RADIX
c = c / sqrdx
Wend
If ((c + r) / f < 0.95 * s) Then
last = 0
g = 1 / f
For j = 1 To n
A(i, j) = A(i, j) * g
Next
For j = 1 To n
A(j, i) = A(j, i) * f
Next
End If
End If
Next
Wend
frmSTATUS.ProgressBar1.Value = frmSTATUS.ProgressBar1.max
End Sub

Private Sub Hessenberg(A() As Double, ByVal n As Integer)
Dim m As Integer, i As Integer, j As Integer
Dim x As Double, y As Double, tg As Double
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Transforming to Hessenberg matric form)"
frmSTATUS.ProgressBar1.max = n - 3
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
For m = 2 To n - 1
DoEvents
If mdl01.tiep_tuc = False Then Exit Sub
x = 0
i = m
For j = m To n
If Abs(A(j, m - 1)) > Abs(x) Then
x = A(j, m - 1)
i = j
End If
Next
If Not (i = m) Then
For j = m - 1 To n
tg = A(i, j)
A(i, j) = A(m, j)
A(m, j) = tg
Next
For j = 1 To n
tg = A(j, i)
A(j, i) = A(j, m)
A(j, m) = tg
Next
End If
If Not (x = 0) Then
For i = m + 1 To n
y = A(i, m - 1) / x
For j = m To n
A(i, j) = A(i, j) - y * A(m, j)
Next
For j = 1 To n
A(j, m) = A(j, m) + y * A(j, i)
Next
Next
End If
frmSTATUS.ProgressBar1.Value = m - 2
Next
End Sub

Private Function Sign(ByVal A As Double, ByVal B As Double) As Double
If B > 0 Then
Sign = Abs(A)
Else
Sign = -Abs(A)
End If
End Function

Public Function Eig(A() As Double, ByVal n As Integer) As Double()
Dim nn As Integer, m As Integer, l As Integer
Dim k As Integer, j As Integer, its As Integer
Dim i As Integer, mmin As Integer, status As Integer
Dim z As Double, y As Double, x As Double
Dim w As Double, v As Double, u As Double
Dim t As Double, s As Double, r As Double
Dim p As Double, q As Double, anorm As Double
Dim wr() As Double
'========================================
Balanc A, n
Hessenberg A, n
'========================================
'BAT DAU TINH CAC GIA TRI RIENG:
'========================================
ReDim wr(1 To n) As Double
frmSTATUS.lblstatus01(1).Caption = mdl01.StrTbao & Chr(10) & "(Computing EigValues)"
frmSTATUS.ProgressBar1.max = n
frmSTATUS.ProgressBar1.Value = 0
frmSTATUS.lblstatus01(1).Refresh
anorm = Abs(A(1, 1))
For i = 2 To n
For j = (i - 1) To n
anorm = anorm + Abs(A(i, j))
Next
Next
status = 0
nn = n
t = 0
While nn >= 1
DoEvents
If mdl01.tiep_tuc = False Then Exit Function
its = 0
Do
For l = nn To 2 Step -1
s = Abs(A(l - 1, l - 1)) + Abs(A(l, l))
If s = 0 Then s = anorm
If Abs(A(l, l - 1)) + s = s Then Exit For
Next
x = A(nn, nn)
If l = nn Then
wr(nn) = x + t
nn = nn - 1
status = status + 1
frmSTATUS.ProgressBar1.Value = status
Else
y = A(nn - 1, nn - 1)
w = A(nn, nn - 1) * A(nn - 1, nn)
If l = (nn - 1) Then
p = 0.5 * (y - x)
q = p * p + w
z = Sqr(Abs(q))
x = x + t
If q >= 0 Then
z = p + Sign(z, p)
wr(nn - 1) = x + z
wr(nn) = x + z
If Not (z = 0) Then wr(nn) = x - w / z
Else
wr(nn - 1) = x + p
wr(nn) = x + p
End If
nn = nn - 2
status = status + 2
frmSTATUS.ProgressBar1.Value = status
Else
If (its = 10) Or (its = 20) Then
t = t + x
For i = 1 To nn
A(i, i) = A(i, i) - x
Next
s = Abs(A(nn, nn - 1)) + Abs(A(nn - 1, nn - 2))
y = 0.75 * s
x = 0.75 * s
w = -0.4375 * s * s
End If
its = its + 1
For m = (nn - 2) To l Step -1
z = A(m, m)
r = x - z
s = y - z
p = (r * s - w) / A(m + 1, m) + A(m, m + 1)
q = A(m + 1, m + 1) - z - r - s
r = A(m + 2, m + 1)
s = Abs(p) + Abs(q) + Abs(r)
p = p / s
q = q / s
r = r / s
If m = l Then Exit For
u = Abs(A(m, m - 1)) * (Abs(q) + Abs(r))
v = Abs(p) * (Abs(A(m - 1, m - 1)) + Abs(z) + Abs(A(m + 1, m + 1)))
If u + v = v Then Exit For
Next
For i = m + 2 To nn
A(i, i - 2) = 0
If Not (i = (m + 2)) Then A(i, i - 3) = 0
Next
For k = m To nn - 1
If Not (k = m) Then
p = A(k, k - 1)
q = A(k + 1, k - 1)
r = 0
If Not (k = (nn - 1)) Then r = A(k + 2, k - 1)
x = Abs(p) + Abs(q) + Abs(r)
If Not (x = 0) Then
p = p / x
q = q / x
r = r / x
End If
End If
s = Sign(Sqr(p * p + q * q + r * r), p)
If Not (s = 0) Then
If k = m Then
If Not (l = m) Then
A(k, k - 1) = -A(k, k - 1)
End If
Else
A(k, k - 1) = -s * x
End If
p = p + s
x = p / s
y = q / s
z = r / s
q = q / p
r = r / p
For j = k To nn
p = A(k, j) + q * A(k + 1, j)
If Not (k = (nn - 1)) Then
p = p + r * A(k + 2, j)
A(k + 2, j) = A(k + 2, j) - p * z
End If
A(k + 1, j) = A(k + 1, j) - p * y
A(k, j) = A(k, j) - p * x
Next
If nn < k + 3 Then
mmin = nn
Else
mmin = k + 3
End If
For i = l To mmin
p = x * A(i, k) + y * A(i, k + 1)
If Not (k = (nn - 1)) Then
p = p + z * A(i, k + 2)
A(i, k + 2) = A(i, k + 2) - p * r
End If
A(i, k + 1) = A(i, k + 1) - p * q
A(i, k) = A(i, k) - p
Next
End If
Next
End If
End If
Loop While l < (nn - 1)
Wend
Eig = wr
End Function
Thân.
 
mình đang học môn kinh tế lượng nhưng khi nhân một ma trận với một số không biết nhân như thế nào? Xin các anh chị chỉ giúp em với. Xin chân thành cảm ơn
 
Sử dụng hàm Add in như worksheetfunction

File ma trận của anh DaoDuy ở đây. Nếu ai muốn thì đăng ký diễn đàn rồi tải ha.
http://www.ketcau.com/forum/showthread.php?p=12557
Bổ sung thêm 2 phần mềm toán học Maple 13 và Matlab 7 nữa nè!
http://www.mediafire.com/?sharekey=0a6adf0944e19201ab1eab3e9fa335ca81ae225f8bb4244e
Thân.
Rất cảm ơn bạn đã chia sẽ file VBA về các hàm ma trận rất hay.
Cho mình hỏi mình muốn sử dụng những hàm này trong VBE thì làm như thế nào?
http://www.ozgrid.com/forum/showthread.php?t=14530
Trang web đó có 1 cách giải đáp nhưng mình không hiểu tại sao :Mình đã tham chiếu đến VBAmatrix rồi nhưng những hàm tính về ma trận như M_Mult_C mình vẫn chưa tính được.
Khi mở Object Browser ra chọn thư viện VBAmatrix, trong cửa sổ Project Window nếu để chuột vào thành phần nào trong VBAmatrix thì tất cả những đối tượng (bao gồm cả đối tượng matrix chứa hàm M_Mult_C) xuất hiện đầy đủ, nhưng khi để chuột đến VBAProject (Book 1) chẳng hạn thì đối tượng matrix chứa hàm M_Mult_C và nhiều đối tượng khác nữa lại biến mất.
Kính mong các bạn giải đáp giúp mình!
Mình mới biết VBA nên chưa hiểu nhiều!
Chân thành cảm ơn!!!
 
VBAProject(Book 1) là 1 Workbook khác rồi bạn à?!
Khi tham chiếu đến Workbook nào thì nó chỉ thấy dữ liệu trên Workbook đó thôi!
Vậy thì tất nhiên bạn sẽ không thấy rồi. Bạn mở quyển sách nào thì văn bản trên quyển sách đó đâu thể thấy trên quyển sách khác được.
Còn việc thực thi lệnh thì giống như bạn đọc cùng lúc nhiều quyền sách vậy đó. Giữ liệu nằm ngay trong đầu thì có thể thao tác trên nhiều quyển sách được chứ. Nhưng nó không giống như con người, nó chỉ thao tác tức thời ngay trên màn hình những gì mình có thôi.
Còn việc truy xuất sâu hơn đòi hỏi bạn phải chỉ cho nó cơ.
Thân.
 
VBAProject(Book 1) là 1 Workbook khác rồi bạn à?!
Khi tham chiếu đến Workbook nào thì nó chỉ thấy dữ liệu trên Workbook đó thôi!
Vậy thì tất nhiên bạn sẽ không thấy rồi. Bạn mở quyển sách nào thì văn bản trên quyển sách đó đâu thể thấy trên quyển sách khác được.
Còn việc thực thi lệnh thì giống như bạn đọc cùng lúc nhiều quyền sách vậy đó. Giữ liệu nằm ngay trong đầu thì có thể thao tác trên nhiều quyển sách được chứ. Nhưng nó không giống như con người, nó chỉ thao tác tức thời ngay trên màn hình những gì mình có thôi.
Còn việc truy xuất sâu hơn đòi hỏi bạn phải chỉ cho nó cơ.
Thân.
Cảm ơn bạn đã trả lời mình

  1. Thật sự là khi mở quyển sách này nhưng mình lại thấy một phần của quyển sách kia bạn ạ, còn mở quyển sách kia thì thấy hoàn chỉnh quyển đó. Cảm tưởng như nó giấu một số đối tượng không cho mình tham chiếu đến đó vậy.Chứ không phải mở quyển nào thì chỉ thấy quyển đó.
  2. Bạn có thể bớt chút thời gian hiếm hoi ví dụ 1 hàm bất kì trong đối tượng matrix ( như hàm M_Mult_C chẳng hạn) cho mình xem cách làm được không. Mình mò mẫm cả ngày hôm nay mà vẫn chưa được. Cái hàm này nếu dùng trong bảng tình thì ko có gì bàn cãi cả, nhưng dùng hàm đó để phát triển việc làm của mình trên VBE thì mình chưa làm được (không biết cách tham chiếu đến hàm đó).Có gì ngớ ngẫn đừng cười mình nhé! Chân thành cảm ơn! Mong nhận được hồi âm sớm!+-+-+-++-+-+-+
 
Thì bạn chỉ cần lấy 2 đoạn code Mat_Complex_Conv(A, ConvType, Optional RetErr) M_MULT_C(Mat1, Mat2, Optional CFormat) để dùng thôi. Vì trong M_MULT_C nó có tham chiếu đến Mat_Complex_Conv nên bạn phải lấy nó theo thôi.
Còn quá trình sử dụng thì nó chỉ sử lý trên mãng thôi. Bạn phải áp dụng hàm mãng nha!
Bạn xem file nha!
Thân.
 

File đính kèm

  • VD.xls
    36.5 KB · Đọc: 104
Thì bạn chỉ cần lấy 2 đoạn code Mat_Complex_Conv(A, ConvType, Optional RetErr) M_MULT_C(Mat1, Mat2, Optional CFormat) để dùng thôi. Vì trong M_MULT_C nó có tham chiếu đến Mat_Complex_Conv nên bạn phải lấy nó theo thôi.
Còn quá trình sử dụng thì nó chỉ sử lý trên mãng thôi. Bạn phải áp dụng hàm mãng nha!
Bạn xem file nha!
Thân.

Một lần nữa cảm ơn bạn nhiệt tình giúp đỡ.
  1. Cách làm này mình cũng biết, đó là chép phần hàm và tham chiếu của code có sẵn trong đó vào trong code của mình để phát triển. Tương tự như tạo một hàm bằng VBA rồi dùng và có vẻ như cách này dùng nhiều hơn nhỉ, có lẽ mình nên nghĩ dùng cách này để làm phần của minh.Coi như tới đây là công việc không bị dừng lại và mình có thể làm tiếp được rồi. Chân thành cảm ơn!
  2. Nếu mình không chép phần code của addins đó vào code mình( trường hợp addins có đặt pass thì không thể dùng code của nó được) khi đó không thể có code mà chép.Trong khi đó mình vẫn muốn dùng hàm trong addins đó ,điều đó có nghĩa là mình phải tham chiếu đến addins đó (tương tự như tham chiếu đến một chương trình khác như VBA cho Autocad chẳng hạn) và dùng những hàm trong đó như hàm của worksheetfunction và đó là cái mà mình chưa làm được.
  3. Khi mình mày mò tham chiếu đến nó rồi (reference tới VBAmatrix) thì lúc đó hàm M_Mult_Cvà tất cả những hàm của đối tượng matrix không thấy nữa trong khi đó một số đối tượng khác vẫn thấy được và tham chiếu được (như là bị giấu mất một số đối tượng mình đã đề cập ở trên.Nếu bạn có thể dùng hàm M_Mult_C mà không cần chép code của nó thì đó chính là cái mình đã hỏi! Chân thành cảm ơn và nếu được bạn giúp thêm cách đó nữa thì mình rất đa tạ.
+-+-+-++-+-+-++-+-+-+
 
Các bạn ơi có thể cho mình hỏi.
Mình cũng đang rất cần viết một số addins để phục vụ cho công việc của mình cũng có liên quan đến mảng (ma trận). Mình cũng đã tham khảo nhiều bài viết của các bạn và cũng đã có thể tùy biến đc theo nhu cầu của mình.
Tuy nhiên có một vấn đề mình chưa thể giải quyết đc mong các bạn chỉ giáo. Số là trong cái addins của mình, một quá trình tính toán mình cần yêu cầu trả về tối thiểu 02 giá trị. Có thể thực hiện việc này bằng cách thực hiện lại hàm nhiều lần và mỗi lần cho trả về một giá trị khác nhau theo yêu cầu của mình. Tuy nhiên có một vấn nếu như file của mình quá lớn thì việc lặp lại quá trình tính toán sẽ làm cho chương trình của mình chạy rất lâu và khi cần trả về nhiều giá trị (Chứ không phải 2 hay 3 giá trị) thì sẽ thực hiện lại rất nhiều lần cho cùng 1 câu lệnh sẽ rất phức tạp.
Mình không biết đã có ai thử trả về giá trị là một mảng (ma trận) hay chưa. Mình đang tìm cách để trả về giá trị cho 1 addins là một mảng (ma trận) và display được cái ma trận trả về ấy trên một worksheet (có thể cùng hoặc có thể khác worksheet với nơi cung cấp dữ liệu). Có bạn nào biết cách trả về một mảng (ma trận) cho một addins thì chỉ giúp mình với.
Cảm ơn các bạn nhiều!
 
Các bạn ơi có thể cho mình hỏi:
Đã có ai thử trả về giá trị là một mảng (ma trận) hay chưa. Mình đang tìm cách để trả về giá trị cho 1 addins là một mảng (ma trận) và display được cái ma trận trả về ấy trên một worksheet (có thể cùng hoặc có thể khác worksheet với nơi cung cấp dữ liệu). Có bạn nào biết cách trả về một mảng (ma trận) cho một addins thì chỉ giúp mình với.
Cảm ơn các bạn nhiều!

Hàm mảng người dùng đã có trên diễn đàn;

Nhưng đó là trả về mảng các giá trị cùng lúc, chứ không như bạn mô tả: trả về lần lượt theo từng đối số nhận được;

Bạn có thể đưa ra ví dụ cụ thể hơn được không? Nãy giờ chúng ta nói suông không à, hơn chán, bạn nhỉ?!

Ví dụ hàm mảng giải phương trình bậc 2, như sau:
Cú pháp hàm : =PTB2(Aa As Double, Bb As Double, Cc As Double) As Variant

Khi đó, bạn chọn 3 ô (ví dụ A1:C1), nhập vô thanh công thức =PTB2(1, -3, 2) & kết thúc bằng tổ hợp fím dành cho hàm mảng ta sẽ thu được nghiệm trên các ô đã chọn.

Còn sau khi đọc iêu cầu của bạn, mình thấy hình như bạn cần là 1 macro thì đúng hơn!

Hãy thảo luận tiếp nha!
 
Web KT
Back
Top Bottom