2014-05-03 30 views
7

Excel'in VBA'sinde bazı matris matematiği yapmak için biraz yardım arıyorum. Excel çalışma sayfasını kullanmanızı öneren bir sürü cevap okudum ama bunu VBA kodunun kendisinde çözmeyi umuyorum.VBA ile Matris Matematiği (Doğrusal Denklemler Sistemi)

Bu basit matris formül A ile çözülebilir
x1 + x2 = 8 
2*x1 + 4*x2 = 100 

* x = B veya x =: başvurum çok daha büyük olmasına rağmen

, en ı çözmek için gereken lineer denklem sistemi var diyelim A^(- 1) o zaman bu çözmek ise, matrisin açısından x1 = -34 ve x2 = 42. bulacaksınız

A = [1, 1; 2, 4] 
B = [8; 100] 

* B nerede,:

X = [-34; 42] 

Excel'in çalışma sayfalarını MMULT ve MINVERSE işlevlerinin yanında kullanmak bunu kolaylaştırır ve gayet iyi çalışmaya başladım. Benim problemim bu hesaplamayı bir VBA fonksiyonu içinde yapmam gerekiyor. İşte çalıştığım şey:

Dim A(0 To 1, 0 To 1) As Single 
Dim B(0 To 0, 0 To 1) As Single 
Dim X(0 To 0, 0 To 1) As Single 

A(0, 0) = 1 
A(1, 0) = 1 
A(0, 1) = 2 
A(1, 1) = 4 

B(0, 0) = 8 
B(0, 1) = 100 

X = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(A), B) 

Maalesef son satırı bir verir "Derleme hatası: dizi atayamayacağı" mesajı. Sanırım dizinin her elemanını birer birer belirtmem gerekiyor, ancak çalışma sayfası işlevleri dizi işlevleri.

Herhangi bir fikri olan var mı? Yardımın için şimdiden teşekkürler!

---------- [DÜZENLEME: Çözüldü] Cor_Blimey ve Jean-François Corbett yardımıyla ----------

, şu ele verdik hatasız tamamlamak için (dizi boyutlarına değişiklikleri not - Ben satır veya sütun olmadığı konusunda karışık geldi ilk):

Dim A(0 To 1, 0 To 1) As Single 
Dim B(0 To 1, 0 To 0) As Single 
Dim X As Variant 

A(0, 0) = 1 
A(0, 1) = 1 
A(1, 0) = 2 
A(1, 1) = 4 

B(0, 0) = 8 
B(1, 0) = 100 

X = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(A), B) 

'Display outputs in a MsgBox for validation 
MsgBox "x1 = " & X(1, 1) & vbNewLine & "x2 = " & X(2, 1), vbCritical 

Teşekkür burada tekrar beni yardımcı olan herkese!

+1

Yerel pencere penceresine bakın (göremiyorsanız, Görünüm> Yerel Ayarlar öğesine tıklayın ve doğru parçaya ulaşmak için ya F8 ile kodunuzdan geçin ya da değişkenlerin değerlerini görmek için bir kopma noktası belirleyin) msgbox'tan önce - size X'in ne olduğunu ve nasıl indeksleyeceğinizi söyleyecektir. MMult tarafından döndürülen dizi aslında bir 'vektör' dizisidir (yani 1 boyutlu) ve bu yüzden X (0) ve X (1) olarak dizinlenmelidir. –

+1

Bu işe yaradı! Referans olarak, MMult'un X (1,1) ve X (2,1) değerlerini sakladığı görülmektedir, bu da mantıklı - Locals penceresini kontrol etmeyi düşünmedim. İyi yakalama! Algoritma hakkında da memnuniyet duyuyorsunuz - excel elektronik tablolarında her zaman kullandım ama VBA'ya hiç ihtiyaç duymadım. Tekrar teşekkürler! :) –

cevap

8

İki şey:

Aynı kural, gerçek matematik olarak uygulanır: B sizin durumunuzda olası olması matris çarpma için dikey dizisi olmalıdır.

Dim B(0 To 1, 0 To 0) As Single 

olarak bildirin ve uygun şekilde başlatın. MMult bir Varyant dizisi döndürür beri Ayrıca, sadece

Dim X As Variant 

ilan ediyoruz. Bu, orijinal hataya neden olan şey.