首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对满足一定条件的矩阵元素进行赋值?

如何对满足一定条件的矩阵元素进行赋值?
EN

Stack Overflow用户
提问于 2019-10-28 22:25:15
回答 2查看 738关注 0票数 1

我需要从矩阵A创建新矩阵,新矩阵中的所有元素都需要是矩阵A的元素,但主对角线上的元素除外。主对角线上的奇数元素需要除以2,主对角线上的偶数元素需要乘以3。

代码语言:javascript
运行
复制
julia> A=rand(1:10 ,3,3)
3×3 Array{Int64,2}:
  5  3  1
  5  2  6
 10  1  7

我决定用两个矩阵来创建新矩阵。首先,我决定保留矩阵A中的所有元素,但主对角线上的元素除外,矩阵B中的主对角线为零:

代码语言:javascript
运行
复制
julia> B=A .* .~ I(3)
3×3 Array{Int64,2}:
  0  3  1
  5  0  6
 10  1  0

然后,我想创建矩阵C,它与A具有相同的主对角线,所有其他元素都是零:

代码语言:javascript
运行
复制
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],而不是用它做一些事情,但我没能把它做好。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-28 23:04:04

简单的循环怎么样?

代码语言:javascript
运行
复制
function change_diagonal!(A)
    @inbounds for i = 1:size(A,1)
        if iseven(A[i,i])
            A[i,i] = 3*A[i,i]
        else
            A[i,i] = A[i,i]/2
        end
    end
    return A
end

其中一个问题是矩阵是Int64类型的,奇数除以二不会产生整数。但是,一般来说,如果您只想对稠密矩阵的主要元素执行操作,那么简单的循环是简单而快速的。需要注意的是,这会修改矩阵,因此在执行operation.if时没有任何内存分配--我们将其扩展为更通用的:

代码语言:javascript
运行
复制
function change_diagonal!(f,A)
    @inbounds for i = 1:size(A,1)
        A[i,i] = f(A[i,i]) 
    end
    return A
end

您可以传递任何函数,该函数将映射到矩阵的对角线元素上。

编辑:还有其他的方法,我不知道是否更快(可能不会),但为了完整起见,这里的思想是:你可以生成一个向量,它对应于矩阵的对角线视图,所以当你修改那个向量时,你就修改了原始矩阵。下面是生成该视图的函数:

代码语言:javascript
运行
复制
function diagonal_view(A)
    return @view A[diagind(A)]
end

现在,您可以像使用一个简单的向量一样处理对角线:

代码语言:javascript
运行
复制
A = rand(1.0:10.0,5,5)
diagA = diagonal_view(A)
diagA .= 40.0 #all elements of the diagonal of A are changed to 40.0
map!(x->2x,diagA,diagA) # another way to modify the diagonal, doubles the values
票数 2
EN

Stack Overflow用户

发布于 2019-10-28 23:27:31

问题是矩阵A是Int64型的,奇数除以二不会产生整数。如果将奇数除以二,则结果不是Int64,(7/2) = 3.5。关键是将矩阵的生成转换为A=rand(1.0:10.0 , 3,3),然后replace!(x->x%2!=0 ? x/2 : x, C)replace!(x->x%2==0 ? x*3 : x, C)完美地工作!

非常感谢@longemen3000 3000指出这一点!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58599170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档