数组和切片4

切片的遍历:

切片的遍历和数组一样,也有两种方式

  1)for 循环常规方式遍历

  2)for-range 结构遍历切片


两种方式都在下面的代码里:

案例演示:

func main() {

  //使用常规的for循环遍历切片
  var arr [5]int = [...]int{10,20,30,40,50}
  slice := arr[1:4] // 20, 30, 40
  for i := 0; i < len(slice); i++ {
  fmt.Printf("slice[%v]=%v ", i, slice[i])
}

fmt.Println()
  //使用for--range 方式遍历切片
  for i, v := range slice {
    fmt.Printf("i=%v v=%v \n", i, v)
  }
}

 

切片的注意事项和细节说明:

切片初始化时 var slice = arr[startIndex:endIndex]
说明:从arr 数组下标为startIndex,取到下标为endIndex的元素,不含arr[endIndex]。

切片初始化时,仍然不能越界。范围在 [0-len(arr)] 之间,但是可以动态增长。

  1)var slice = arr[0:end] 可以简写 var slice = arr[:end]
  2)var slice = arr[start:len(arr)] 可以简写: var slice = arr[start:]
  3)var slice = arr[0:len(arr)] 可以简写: var slice = arr[:]


cap是一个内置函数,用于统计切片的容量,即最大可以存放多少个元素。

切片定义完后,还不能使用,因为本身是一个空的,需要让其引用到一个数组,或者make一个空间供切片来使用

切片可以继续切片

 

用append内置函数,可对切片进行动态追加

func main() {

  //用append内置函数,可以对切片进行动态追加

  var slice3 = []int{100, 200, 300}

  //通过append直接给slice3追加具体的元素

  slice3 = append(slice3, 400, 500, 600)

  //通过append将切片slice3追加给slice3

  slice3 = append(slice3, slice3...)

  fmt.Println("slice3=", slice3)
}

切片append操作的底层原理分析:

  1)切片append操作的本质就是对数组扩容

  2)go底层会创建一个新的数组newArr(按照扩容后大小)

  3)将slice原来包含的元素拷贝到新的数组newArr

  4)slice重新引用到newArr

  5)注意newArr是在底层来维护的,程序员不可见

  6)案例演示说明:

 

 

切片的拷贝操作:

切片使用copy内置函数完成拷贝,举例说明:

func main() {

  var slice4 []int = []int {1,2,3,4,5}
  var slice5 = make([]int, 10)
  copy(slice5, slice4)
  fmt.Println("slice4=", slice4)
  fmt.Println("slice5=", slice5)
}


对上面代码的说明:

(1)copy(para1, para2):参数的数据类型都是切片类型。

(2)按照上面的代码来看,slice4和slice5的数据空间是独立的,相互不影响,也就是说 slice4[0]=999,slice5[0] 仍然是1。


思考题:下面的代码有没有错误:

var a []int = []int {1,2,3,4,5}
var slice = make([]int, 1)
fmt.Println(slice)   //0
copy(slice, a)   //这里是不会报长度不够这个错的,虽然长度只有1。长度有多大,就拷贝几个值过来
fmt.Println(slice)   //1

说明:上面的代码没有问题,可以运行,最后输出的结果是 【1】

 

 

 

 

 

 

 

 

 

 

 

string和slice:

1)string底层是一个byte数组,因此string也可以进行切片处理

案例演示:

func main() {

  str := "hello@atguigu"
  slice := str[6:]
  fmt.Println("slice=",slice)
}

2)string和切片在内存的形态,以“abcd” 画出内存示意图

 

3)string是不可变的,也就说不能通过 str[0] = 'z' 方式来修改字符串

4)如果需要修改字符串,可以先将string -> []byte / 或者 []rune -> 修改 -> 重写转成string

func main() {

  str := "hello@atguigu"
  slice := str[6:]
  fmt.Println("slice=",slice)

  //str[0] = 'z' [编译不会通过,报错,原因是string是不可变的]

  // arr1 := []byte(str)
  // arr1[0] = 'z'
  // str = string(arr1)
  // fmt.Println("str=", str)

  //细节,我们转成[]byte后,可以处理英文和数字,但是不能处理中文
  //原因是 []byte 按字节来处理的,而一个汉字是3个字节,因此就会出现乱码
  //解决方法是将 string 转成 []rune 即可,因为 []rune是按字符处理,兼容汉字
  arr1 := []rune(str)
  arr1[0] = '北'
  str = string(arr1)
  fmt.Println("str=", str)
}

 

转载于:https://www.cnblogs.com/green-frog-2019/p/11355508.html

时频分析工具箱中提供了计算各种线性时频表示和双线性时频分布的函数, 本帖主要列出时频分析工具箱函数简介,以号召大家就时频分析应用展开相关讨论。 一、信号产生函数: amexpo1s 单边指数幅值调制信号 amexpo2s 双边指数幅值调制信号 amgauss 高斯幅值调制信号 amrect 矩形幅值调制信号 amtriang 三角形幅值调制信号 fmconst 定频调制信号 fmhyp 双曲线频率调制信号 fmlin 线性频率调制信号 fmodany 任意频率调制信号 fmpar 抛物线频率调制信号 fmpower 幂指数频率调制信号 fmsin 正弦频率调制信号 gdpower 能量律群延迟信号 altes 时域Altes信号 anaask 幅值键移信号 anabpsk 二进制相位键移信号 anafsk 频率键移信号 anapulse 单位脉冲信号的解析投影 anaqpsk 四进制相位键移信号 anasing Lipscjitz 奇异性 anaste 单位阶跃信号的解析投影 atoms 基本高斯元的线性组合 dopnoise 复多普勒任意信号 doppler 复多普勒信号 klauder 时域Klauder小波 mexhat 时域墨西哥帽小波 二、噪声产生函数 noiseecg 解析复高斯噪声 noiseecu 解析复单位高斯噪声 tfrgabor Gabor表示 tfrstft 短时傅立叶变换 ifestar2 使用AR(2)模型的瞬时频率估计 instfreq 瞬时频率估计 sqrpdlay 群延迟估计 三、模糊函数 ambifunb 窄带模糊函数 ambifuwb 宽带模糊函数 四、Affine类双核线性时频处理函数 tfrbert 单式Bertrand分布 tfrdfla D-Flandrin分布 tfrscalo 尺度图 tfrspaw 平滑伪Affine类Wigner分布 tfrunter Unterberger分布 五、Cohen类双核线性时频处理函数 tfrbj Born-Jordan分布 tfrbud Butterworth分布 tfrcw Choi-Williams分布 tfrgrd 归一化的矩形分布 tfrmh Margenau-Hill分布 tfrmhs Margenau-Hill频谱分布 tfrmmce 谱图的最小平均互熵组合 tfrpage Page分布 tfrwv 伪Wigner-Ville分布 tfrri Rihaczek分布 tfrridb 降低交叉项的分布(Bessel窗) tfrridbn 降低交叉项的分布(二项式窗) tfrridh 降低交叉项的分布(汉宁窗) tfrridt 降低交叉项的分布(三角窗) tfrsp 谱图分布 tfrspwv 平滑伪Wigner-Ville分布 tfrwv Wigner-Ville分布 tfrzam Zhao-Atlas-Marks分布 六、其他处理函数: friedman 瞬时频率密度 htl 图像直线检测中的Hough变换 margtfr 时频表示的能量 momftfr 时频表示的频率矩 momttfr 时频表示的时间矩 renyi Renyi信息度量 ridges 波峰提取 plotifl 绘制归一化的瞬时频率规律 tfrparam 返回用于显示时频表示的参数 tfrqview 时频表示的快速可视化 tfrsave 保存时频表示的参数 tfrview 时频表示的可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值