【发布时间】:2019-10-28 22:25:15
【问题描述】:
我需要从矩阵 A 创建新矩阵。新矩阵中的所有元素都必须是矩阵 A 中的元素,但主对角线上的元素除外。主对角线上的奇数元素需要除以 2,主对角线上的偶数元素需要乘以 3。
julia> A=rand(1:10 ,3,3)
3×3 Array{Int64,2}:
5 3 1
5 2 6
10 1 7
我决定从两个矩阵创建新矩阵。 首先,我决定保留矩阵 A 中的所有元素,除了主对角线上的元素,矩阵 B 中的主对角线为零:
julia> B=A .* .~ I(3)
3×3 Array{Int64,2}:
0 3 1
5 0 6
10 1 0
然后我想创建与 A 具有相同主对角线的矩阵 C,并且所有其他元素都为零:
julia> C=A .* one(A)
3×3 Array{Int64,2}:
5 0 0
0 2 0
0 0 7
最后,我的目标是对矩阵 C 进行所有更改,然后将最终矩阵创建为
D = C + B;
我在更改主对角线时遇到问题,因为我不确定如何为满足特定条件的矩阵元素赋值。 例如,主对角线上的偶数元素如何乘以3,主对角线上的奇数元素如何除以2?
我尝试使用替换:replace!(x->x%2!=0 ? x/2 : x, C),但它返回错误。
我尝试使用C[C .% 2 .!=0],而不是用它做点什么,但我做错了。
提前致谢!
【问题讨论】:
-
我注意到您的配方存在问题。如果将奇数除以 2,则结果不是 Int64,(7/2) = 3.5。对吗?
-
@longemen3000 是的,你是对的。我忽略了它...你知道我该如何解决或者转换它吗?
-
您可以将矩阵的生成从
rand(1:10,3,3)更改为rand(1.0:10.0,3,3)。另一个问题是iseven方法不适用于浮点数,但可以用函数my_iseven(x) = rem(x,2) == zero(x)替换 -
@longemen3000 关键是将矩阵的生成更改为
A=rand(1.0:10.0 , 3,3),然后replace!(x->x%2!=0 ? x/2 : x, C)完美运行!非常感谢!