Amro
September 15, 2022, 6:14pm
1
In the below, I building matrix A
which consists of for sub-matrices Y,A1,A2,A3
.I want the mutation on A3
be applied automatically on A
as well. How can I do that please?
using BenchmarkTools, StaticArrays, LinearAlgebra, SparseArrays, .Threads
Y = [1 2;3 4];
A1 = [5 6;7 8];
A2 = [11 22;33 44];
A3 = [0 0;0 0];
A = [Y A1; A2 A3]
A3 .= [1 1; 1 1]; # I want the change also be applied on A
A
lmiq
September 15, 2022, 6:32pm
2
You either want a vector of matrices, i. e.:
julia> A3 = [0 0;0 0];
julia> A = [Y,A1,A2,A3];
julia> A3 .= [1 1; 1 1]; # I want the change also be applied on A
julia> A
4-element Vector{Matrix{Int64}}:
[1 2; 3 4]
[5 6; 7 8]
[11 22; 33 44]
[1 1; 1 1]
Or you want to define the matrix and then its slices:
julia> A
4×4 Matrix{Int64}:
1 2 5 6
3 4 7 8
11 22 0 0
33 44 0 0
julia> A3 = @view(A[3:4,3:4])
2×2 view(::Matrix{Int64}, 3:4, 3:4) with eltype Int64:
0 0
0 0
julia> A3 .= 1
2×2 view(::Matrix{Int64}, 3:4, 3:4) with eltype Int64:
1 1
1 1
julia> A
4×4 Matrix{Int64}:
1 2 5 6
3 4 7 8
11 22 1 1
33 44 1 1
3 Likes
Amro
September 15, 2022, 6:57pm
3
Thank you very much!
If the first method is used, and I want to solve x=A\b
I get the below error. Is there a way to solve it or just work with the second method you proposed?
where,
Y = [1 2;3 4];
A1 = [5 6;7 8];
A2 = [11 22;33 44];
A3 = [5 5;5 5];
A = [Y,A1,A2,A3];
4-element Vector{Matrix{Int64}}:
[1 2; 3 4]
[5 6; 7 8]
[11 22; 33 44]
[5 5; 5 5]
julia> b=[1;1;1;1]
4-element Vector{Int64}:
1
1
1
1
julia> A\b
ERROR: MethodError: no method matching zero(::Type{Matrix{Int64}})
lmiq
September 15, 2022, 7:15pm
4
Oh, yes, in the first one A
is not a regular matrix, it is a vector of matrices, so A\b
won’t work. I think you need something in the lines of the second case.
1 Like
Edit- I see lmiq gave the view
solution already, I missed the second half
I think what you want is a collection of view
s into A
.
Once you combine Y, A1, A2, A3
into A
, A
is now an entirely new Matrix
without the references to Y, A1, A2, A3
.
_Y = [1 2; 3 4];
_A1 = [5 6; 7 8];
_A2 = [11 22; 33 44];
_A3 = [0 0; 0 0];
A = [_Y _A1; _A2 _A3]
# 4×4 Matrix{Int64}:
# 1 2 5 6
# 3 4 7 8
# 11 22 0 0
# 33 44 0 0
Y = view(A, 1:2, 1:2)
A1 = view(A, 1:2, 3:4)
A2 = view(A, 3:4, 1:2)
A3 = view(A, 3:4, 3:4)
A3 .= 1
A
# 4x4 Matrix{Int64}:
# 1 2 5 6
# 3 4 7 8
# 11 22 1 1
# 33 44 1 1
2 Likes
Amro
September 15, 2022, 9:30pm
7
@lmiq @sbuercklin
Thank you very much!
I tried to implement your feedbacks on building a left-shifted matrix A_shiftl
of A
. So, when I mutate A
, the A_shiftl
will be mutated as well. However, I could not do that. Any help please here?
I have and I have which it elements
A = [1.0 5 0 0 0;0 1 0 0 0;0 0 1 0 0 ;0 0 0 1 0;0 0 0 0 1];
A_shiftl = [@view(A[:,2:end]) zeros(size(A,1))]
A[3,3] =5;
julia> A
5×5 Matrix{Float64}:
1.0 5.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0 0.0
0.0 0.0 5.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
0.0 0.0 0.0 0.0 1.0
julia> A_shiftl # It did not follow the change in A
5×5 Matrix{Float64}:
5.0 0.0 0.0 0.0 0.0
1.0 0.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
lmiq
September 15, 2022, 9:45pm
8
No, that won’t work like that in general. It is better of you write functions that operate on the matrices as you want, given ranges and values.
1 Like
Amro
September 15, 2022, 10:13pm
10
@lmiq @sbuercklin
When I am using @view with sparsematrix, the resulting one is not sparse like Asp_r
below. Any way to keep it sparse?
Asp = spzeros(5,6);
Asp[1,1] = 1.0;
Asp[1,2] = 5.0;
Asp[2,2] = 1.0;
Asp[3,3] = 1.0;
Asp[4,4] = 1.0;
Asp[5,5] = 1.0;
julia> Asp_r =@view(Asp[:,1:end-1])
5×5 view(::SparseMatrixCSC{Float64, Int64}, :, 1:5) with eltype Float64:
1.0 5.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0 0.0
0.0 0.0 1.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
0.0 0.0 0.0 0.0 1.0
It looks sparse to me, it just prints a 0.0
instead of .
for the empty entries because of how view
s print. You can check sparsity using issparse
:
julia> issparse(Asp_r)
true
I recommend looking at the Views
section of the Julia manual here
1 Like
Amro
September 16, 2022, 2:36pm
12
Thanks for your feedback.