Skip to content

Commit 8183663

Browse files
authored
Add conversion from AbstractArray to mxarray (JuliaInterop#229)
* Add conversion from AbstractArray to mxarray * Update support for complex abstract vectors * Extend types and test cases
1 parent 3bd0547 commit 8183663

File tree

3 files changed

+80
-7
lines changed

3 files changed

+80
-7
lines changed

src/mxarray.jl

+26-3
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ function mxarray(a::Array{T}) where T<:MxRealNum
264264
return mx
265265
end
266266

267-
function mxarray(a::Array{T}) where T<:MxComplexNum
267+
268+
function mxarray(a::Array{T}) where {T<:MxComplexNum}
268269
mx = mxarray(T, size(a))
269270
na = length(a)
270271
rdat = unsafe_wrap(Array, real_ptr(mx), na)
@@ -276,8 +277,30 @@ function mxarray(a::Array{T}) where T<:MxComplexNum
276277
mx
277278
end
278279

279-
mxarray(a::BitArray) = mxarray(convert(Array{Bool}, a))
280-
mxarray(a::AbstractRange) = mxarray([a;])
280+
281+
function mxarray(a::AbstractArray{T}) where {T<:MxRealNum}
282+
mx = mxarray(T, size(a))
283+
ptr = data_ptr(mx)
284+
na = length(a)
285+
dat = unsafe_wrap(Array{T}, ptr, na)
286+
for (i, ix) in enumerate(eachindex(a))
287+
dat[i] = a[ix]
288+
end
289+
return mx
290+
end
291+
292+
function mxarray(a::AbstractArray{T}) where {T<:MxComplexNum}
293+
mx = mxarray(T, size(a))
294+
na = length(a)
295+
rdat = unsafe_wrap(Array, real_ptr(mx), na)
296+
idat = unsafe_wrap(Array, imag_ptr(mx), na)
297+
for (i, ix) in enumerate(eachindex(a))
298+
rdat[i] = real(a[ix])
299+
idat[i] = imag(a[ix])
300+
end
301+
return mx
302+
end
303+
281304

282305
# sparse matrix
283306

test/mxarray.jl

+50
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using MATLAB
22
using Test
3+
using SparseArrays
34

45
# Unit testing for MxArray
56

@@ -361,6 +362,55 @@ delete(a_mx)
361362
@test a == a_jl
362363
@test isa(a_jl, SparseMatrixCSC{Complex{Float64}})
363364

365+
##############################
366+
# Abstract Array Conversions
367+
##############################
368+
369+
a = transpose(rand(10))
370+
x = mxarray(a)
371+
y = jvalue(x)
372+
delete(x)
373+
@test isa(y, Array{Float64,2})
374+
@test size(y) == size(a)
375+
@test isequal(y, a)
376+
377+
a = rand(10,10)
378+
a_ = @view a[3:7, 4:8]
379+
x = mxarray(a_)
380+
y = jvalue(x)
381+
delete(x)
382+
@test isa(y, Array{Float64,2})
383+
@test size(y) == size(a_)
384+
@test isequal(y, a_)
385+
386+
a_ = rand(ComplexF32, 10, 10, 10)
387+
a = @view a_[3:7, 4:8, 2:5]
388+
x = mxarray(a)
389+
y = jvalue(x)
390+
delete(x)
391+
@test isa(y, Array{ComplexF32,3})
392+
@test size(y) == size(a)
393+
394+
a = 1:100 # range
395+
x = mxarray(a)
396+
y = jvalue(x)
397+
delete(x)
398+
@test isa(y, Array{Int64,1})
399+
@test isequal(y, collect(a))
400+
401+
a = BitArray(rand(Bool, 5,20,10))
402+
x = mxarray(a)
403+
y = jvalue(x)
404+
delete(x)
405+
@test isa(y, Array{Bool,3})
406+
@test isequal(y, a)
407+
408+
409+
410+
##############################
411+
# String Conversions
412+
##############################
413+
364414
a = "MATLAB"
365415
x = mxarray(a)
366416
y = jvalue(x)

test/runtests.jl

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ using Test
44
is_ci() = lowercase(get(ENV, "CI", "false")) == "true"
55

66
if !is_ci() # only test if not CI
7-
include("engine.jl")
8-
include("matfile.jl")
9-
include("matstr.jl")
10-
include("mxarray.jl")
7+
include("engine.jl")
8+
include("matfile.jl")
9+
include("matstr.jl")
10+
include("mxarray.jl")
1111
end

0 commit comments

Comments
 (0)