-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added
ConjArray
wrapper type for conjugate views
By default, this is used only in conjugation with `RowVector`, so that both `transpose(vec)` and `ctranspose(vec)` both return views.
- Loading branch information
Andy Ferris
committed
Jan 19, 2017
1 parent
71fa0a6
commit b70aa6e
Showing
8 changed files
with
80 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -49,6 +49,7 @@ export | |
Complex128, | ||
Complex64, | ||
Complex32, | ||
ConjArray, | ||
DenseMatrix, | ||
DenseVecOrMat, | ||
DenseVector, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
# This file is a part of Julia. License is MIT: http://julialang.org/license | ||
|
||
""" | ||
ConjArray(array) | ||
A lazy-view wrapper of an `AbstractArray`, taking the elementwise complex | ||
conjugate. This type is usually constructed (and unwrapped) via the `conj()` | ||
function (or related `ctranspose()`), but currently this is the default behavior | ||
for `RowVector` only. | ||
""" | ||
immutable ConjArray{T, N, A <: AbstractArray} <: AbstractArray{T, N} | ||
parent::A | ||
end | ||
|
||
@inline ConjArray{T,N}(a::AbstractArray{T,N}) = ConjArray{conj_type(T), N, typeof(a)}(a) | ||
|
||
# This type can cause the element type to change under conjugation - e.g. an array of complex arrays. | ||
@inline conj_type(x) = conj_type(typeof(x)) | ||
@inline conj_type{T}(::Type{T}) = promote_op(conj, T) | ||
|
||
@inline parent(c::ConjArray) = c.parent | ||
@inline parent_type(c::ConjArray) = parent_type(typeof(c)) | ||
@inline parent_type{T,N,A}(::Type{ConjArray{T,N,A}}) = A | ||
|
||
@inline size(a::ConjArray) = size(a.parent) | ||
linearindexing{CA <: ConjArray}(::Union{CA,Type{CA}}) = linearindexing(parent_type(CA)) | ||
|
||
@propagate_inbounds getindex{T,N}(a::ConjArray{T,N}, i::Int) = conj(getindex(a.parent, i)) | ||
@propagate_inbounds getindex{T,N}(a::ConjArray{T,N}, i::Vararg{Int,N}) = conj(getindex(a.parent, i...)) | ||
@propagate_inbounds setindex!{T,N}(a::ConjArray{T,N}, v, i::Int) = setindex!(a.parent, conj(v), i) | ||
@propagate_inbounds setindex!{T,N}(a::ConjArray{T,N}, v, i::Vararg{Int,N}) = setindex!(a.parent, conj(v), i...) | ||
|
||
# Currently, this is default behavior for RowVector only | ||
""" | ||
conj(rowvector) | ||
Returns a `ConjArray` lazy view of the input, where each element is conjugated. | ||
""" | ||
@inline conj(rv::RowVector) = RowVector(_conj(parent(rv))) | ||
@inline conj(a::ConjArray) = parent(a) | ||
|
||
@inline _conj(a::AbstractArray) = ConjArray(a) | ||
@inline _conj{T<:Real}(a::AbstractArray{T}) = a | ||
@inline _conj(a::ConjArray) = parent(a) | ||
@inline _conj{T<:Real}(a::ConjArray{T}) = parent(a) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# This file is a part of Julia. License is MIT: http://julialang.org/license | ||
|
||
@testset "RowVector" begin | ||
|
||
@testset "Core" begin | ||
m = [1+im 2; 2 4-im] | ||
cm = ConjArray(m) | ||
@test cm[1,1] == 1-im | ||
@test trace(cm*m) == 27 | ||
|
||
v = [[1+im], [1-im]] | ||
cv = ConjArray(v) | ||
@test cv[1] == [1-im] | ||
end | ||
|
||
@testset "RowVector conjugates" begin | ||
v = [1+im, 1-im] | ||
rv = v' | ||
@test (parent(rv) isa ConjArray) | ||
@test rv' === v | ||
end | ||
|
||
end |