前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3 数学运算 矩阵操作

3 数学运算 矩阵操作

作者头像
猫叔Rex
发布2020-06-30 14:33:10
7330
发布2020-06-30 14:33:10
举报
文章被收录于专栏:科学计算科学计算

数学运算

比Matlab更直观的数学表达方式

代码语言:javascript
复制
x = 10
2x
>>20

但这就导致了可能会出现语法的冲突

  • 十六进制整数文本表达式 0xff 可以被解析为数值文本 0 乘以变量 xff
  • 浮点数文本表达式 1e10 可以被解析为数值文本 1 乘以变量 e10
  • 因此,Julia中
  • 以 0x 开头的表达式,都被解析为十六进制文本
  • 以数字文本开头,后面跟着 e 或 E ,都被解析为浮点数文本

运算方法

常用的 + - x /就不多说了,跟其他语言基本完全一样。

这里说一下向量运算,跟MATLAB的操作完全相同,比如向量的点乘,就是说对向量的元素一一操作

代码语言:javascript
复制
[1,2,3].*3
>>3-element Array{Int64,1}:
 3
 6
 9

比较运算,支持链式比较

代码语言:javascript
复制
1 <= 2 <= 3 == 3 <=5 >4 >=2
>>true

常用的数学函数

代码语言:javascript
复制
# 进位函数
round(x)        #四舍五入
floor(x)        #向下取整
ceil(x)         #向上取整
trunc(x)        #trunc是直接砍掉小数,在正数的时候trunc跟floor一样,负数时跟ceil一样
# 除法函数
div(x,y)        #取模
fld(x,y)        #取小于结果的最大整数
cld(x,y)        #取大于结果的最小整数
rem(x,y)        #取余
mod(x,y)        
mod1(x,y1)      #如果x是y的整数倍,则返回y,不会返回余数
mod2pi(x)       #对2pi取余
divrem(x,y)     #返回取模的值和取余的值
fldmod(x,y)     #返回取小于x的最大整数和取余的值
gcd(x,y...)     #最大公约数
lcm(x,y...)     #最小公倍数
# 符号函数
abs(x)          #求模
abs2(x)         #求平方
sign(x)         #取符号
signbit(x)      #正数返回false,负数返回true
copysign(x,y)   #返回x * sign(y)
flipsign(x,y)   #返回x * sign(y) * -1
# 开根号 log
sqrt(x)         #开根号
cbrt(x)         #开三次根
hypot(x,y)      #sqrt(x^2 + y^2)
exp(x)          #e^x
expm1(x)        #e^-x
ldexp(x,n)      #x^n
log(x)          #loge(x)
log(b,x)        #logb(x)
log2(x)         #log2(x)     
log10(x)        #log10(x)
log1p(x)        #loge(1+x)
# 三角函数
sin    cos    tan    cot    sec    csc
sinh   cosh   tanh   coth   sech   csch
asin   acos   atan   acot   asec   acsc
asinh  acosh  atanh  acoth  asech  acsch
sinc   cosc

矩阵操作

既然是做科学计算,那肯定是少不了矩阵,先从简单的向量说起 首先定义一个简单的矩阵,在REPL中看返回的类型

代码语言:javascript
复制
a = [1,2,3,4]
>>4-element Array{Int64,1}:
 1
 2
 3
 4

Julia中也可以像MATLAB中定义步进向量

代码语言:javascript
复制
aa = (1:2:5)
aa.start
aa.step
aa.stop
first(aa)
step(aa)
last(aa)
代码语言:javascript
复制
Int8[3, 4, 5]
>>3-element Array{Int8,1}:
 3
 4
 5
["one", "two", "threee"]
>>3-element Array{String,1}:
 "one"   
 "two"   
 "threee"
[true, "two", 1, 2.0]
>>4-element Array{Any,1}:
 true     
     "two"
    1     
    2.0   
[]
>>0-element Array{Any,1}
Int8[]
>>0-element Array{Int8,1}
a = (1, 2, 3)  # tuple
b = collect(a)
>>3-element Array{Int64,1}:
 1
 2
 3
c = collect(1:4) #不能直接写成[1:4]
c[2:end]
c1 = c      # c1与c的内存地址相同
c2 = c[:]   # c2是c的一个拷贝
c1[1] = 10
c
>>4-element Array{Int64,1}:
 10
  2
  3
  4
c2[1] = 20
c
>>4-element Array{Int64,1}:
 10
  2
  3
  4
代码语言:javascript
复制
b = [1;2;3;4]
>>4-element Array{Int64,1}:
 1
 2
 3
 4
c = [1 2 3 4]
>>1×4 Array{Int64,2}:
 1  2  3  4

再来看矩阵拼接中的空格 , ;的区别

代码语言:javascript
复制
x = ones(2,3)
y = zeros(2,3)
z = [x y]
>>2×6 Array{Float64,2}:
  1.0  1.0  1.0  0.0  0.0  0.0
  1.0  1.0  1.0  0.0  0.0  0.0
相当于hcat(x,y)
ndims(z)
>>2

z = [x,y]
>>2-element Array{Array{Float64,2},1}:
  [1.0 1.0 1.0; 1.0 1.0 1.0]
  [0.0 0.0 0.0; 0.0 0.0 0.0]
ndims(z)
>>1

[x;y]
>>4×3 Array{Float64,2}:
  1.0  1.0  1.0
  1.0  1.0  1.0
  0.0  0.0  0.0
  0.0  0.0  0.0
相当于vcat(x,y)
ndims(z)
>>2

那怎么把[x,y]也变成一个没有嵌套的矩阵呢?

代码语言:javascript
复制
hcat([x,y]...) #表示把矩阵内部的Array作拼接

# 矩阵索引,从1开始
x[1]
>>1
x[6]
>>1
size(x)
>>(2,3)
length(x)
>>6
sum(x)
>>6

矩阵运算

代码语言:javascript
复制
a = collect(reshape(1:6,2,3))
b = ones(2,3)
a .+ b
a .- b
a * b # error
a .* b
a * b'
a / b
a ./ b

函数对矩阵操作时,也要加.

代码语言:javascript
复制
A = [1,2,3]
sin.(A)
>>3-element Array{Float64,1}:
 0.8414709848078965
 0.9092974268256817
 0.1411200080598672

添加/删除/移动

代码语言:javascript
复制
a = [1,2,3]
push!(a, 4)
pop!(a)
push!(a, 4,5,6)
push!(a, [7,8,9])
>>error
append!(a, [7,8,9])
prepend!(a, [10,11,12])

arr = reshape(1:6, 2, 3)
circshift(arr, (0,1))
circshift(arr, (1,-2))

对于矩阵的基本操作中,很多matlab中的函数Julia中基本也有,用法也基本一致

eg.

代码语言:javascript
复制
rand(10)
rand(2,3)
rand(Int32,2,3)
reshape(1:6, (2,3))

注:如果有些常用的数学函数发现在Julia中不能使用,比如mean()函数,则可以使用Statistics package。常用的数值分析的函数都在里面。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 傅里叶的猫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数学运算
  • 矩阵操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档