Functions that return arrays

P

Pflugs

I am trying to a UDF that uses arrays and worksheet matrix functions to
calculate the intersection of three spheres. I have declared several 1- and
2-D double arrays to store data.

I originally declared these array variables as doubles, but I found I could
not use functions like the following example:

Dim tempMatrix(1 to 3, 1 to 3) as Double
tempVector = identity(tempVector)

where "identity" is a UDF that accepts a square array and sets it to an
identity matrix. I imagine that I cannot assign the function's return to
tempVector because it is a double array, not a Variant (i.e. not an object).

I declared these variables as Doubles because I have read that variants are
slow and inefficient and should be avoided if possible. How then would be
the best way to fill these variable? Should I use subroutines and send the
double array as a parameter? Or should I use variant arrays?

But then, variant arrays cannot be initialized with dimensions, right? I.e:

Dim tempVector(1 to 3, 1 to 3) as Variant

I'm looking for the Best Practice here. Thanks.
Pflugs
 
T

Tom Ogilvy

Use variants since that is what is required to do what you want.

Dim tempVector as Variant
ReDim tempVector(1 to 3, 1 to 3)
 
P

Pflugs

How do I use the matrix functions with varaint arrays? Do I first have to
create a similar double array?
 
T

Tom Ogilvy

If you have to use a double, then adjust your identity function so it isn't a
function but a subroutine.

Arrays are passed by reference, so if you work on it in the identity
function, you don't have to "return" it. Just call your Identity sub with
the tempVector as an argument

sub Main()
Identity TempVector
' now just use the altered tempVector

end sub

Public sub Identity( t() as Double )
' code that alters "t"
' no code like Identity = t
End sub
 
D

Dana DeLouis

where "identity" is a UDF that accepts a square array and sets it to an
identity matrix.

Instead of using two loops, here's something I might use:

Sub MainCode()
Dim m As Variant
m = IdentityMatrix(3)
End Sub

Function IdentityMatrix(n)
IdentityMatrix = Evaluate(Replace("--(ROW(#)=COLUMN(#))", "#",
[A1].Resize(n, n).Address))
End Function
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top