JS笔记 (九) 数组方法

Array() 数组

定义/声明方式
var arr = [];// 字面量; 常用

var arr1 = Array(1,2,3); //函数式
console.log(arr1)// [1,2,3]

var arr2 = Array(6);//[empty × 6]
//只传一个值的时候就创建一个长度为6有6个空值的数组

var arr3 = new Array(1,2,3);//[1,2,3]
var arr4 = new Array(6);//[empty × 6] 同上

length 长度

返回数组的长度

var arr = [1,2,3,4] ; 
console.log(arr.length) // 4
arr.length = 0 // []	清空数组  length	可读可写;

访问 arr.[index]

通过下标访问数组对应的内容 从 0 开始

var arr = [1,2,3,4]
console.log(arr[0]) // 1

//二维数组的访问
var arr1 = [1,2,3,[4,5,6]]
console.log(arr1[3][2]) //6   找到下标为3的数组然后 然后再找里面下标为2的值

在后面添加数据
var arr = ['我','爱','你']
arr[arr.length] = '一生一世'
console.log(arr)//["我", "爱", "你", "一生一世"] 

方法

  • concat 数组拼接

注意:原数组不变

var arr = [1,2,3]
var arr1 = [4,5,6]
var arr2 = arr.concat(arr1)
var arr3 = arr.concat(arr1,'我还能接')
console.log(arr)//[1,2,3]
console.log(arr1)//[4,5,6]
console.log(arr2)// 拼接好的 [1, 2, 3, 4, 5, 6]
console.log(arr3)// [1, 2, 3, 4, 5, 6, "我还能接"]

  • join 拼接成字符串

注意:原数组不变

var arr = ['不','要','分','开','我','们']
console.log(arr.join(''))//"不要分开我们"
console.log(arr.join('-'))//"不-要-分-开-我-们"
console.log(arr) //['不','要','分','开','我','们'] 原数组不变
  • indexOf 查找数组里的数据
var arr = ['a','b','c','d','e','e','a','b']
console.log( arr.indexOf('b'));  //1    value 匹配字符 
console.log( arr2.indexOf('b',2)); //7  需要寻找得value值,从index开始找 ,合法值是 0 到 arr.length-1 , 默认0 
//匹配失败返回-1//如果里面增加个[123],那么不能返回对应的下标;var arr = [1,2,3,4,5,0,[123]];
console.log( arr.indexOf([123]) );
  • delete 删除项

注意:这种方法删除之后,对应的位置还在 ,返会对应的项为空值

var arr = [1,2,3,4,5,6]
console.log(delete arr[2])// [1, 2, empty, 4, 5, 6]
  • unshift ( item,item1,…. ) 在数组头部添加一个或多个元素,并返回(新的长度)
var arr = [5,2,0,1,3,1,4];              
console.log( arr.unshift( '我','对','你','说' ) );  //11 返回(新的长度)
console.log( arr );// ["我", "对", "你", "说", 5, 2, 0, 1, 3, 1, 4]
  • push( item,item1,…. ) 在数组的尾部添加一个或多个元素,并返回(新的长度)。
var arr = [5,2,0,1,3,1,4];              
console.log( arr.push( '我','对','你','说' ) );  //11 返回(新的长度)
console.log( arr );// [5, 2, 0, 1, 3, 1, 4, "我", "对", "你", "说"]
  • pop( ) 删除数组的最后一个元素,并返回(删除对象)。
var arr = [1,2,3,4,5,6,7]
console.log(arr.pop()) //7 删除的对象 
console.log(arr)//[1,2,3,4,5,6]
  • splice

arr.splice(index,how,tiem1,item2) 删除 替换 添加 ,返回删除项 --原数组改变

//删除
var arr = [1,2,3,4,5,6]
var arr1 = arr.splice(1,5) //从下标 1 开始以删除 删除个数 5个
console.log(arr) // [1] 
console.log(arr1)// [2, 3, 4, 5, 6] 返回删除项

//替换
var arr = [1,2,3,4,5,6]
var arr1 = arr.splice(1,2,'你好','再见')
console.log( arr );// [1, "你好", "再见", 4, 5, 6] 从下标 1 开始以删除 删除个数 2 个  并且插入 你好,再见
console.log( arr1 );//[2, 3] 返回删除项

//添加
var arr = [1,2,3,4,5,6]
var arr1 = arr.splice(1,0,'你好')
console.log( arr );// [1, "你好", 4, 5, 6] 从下标 1 开始以删除 删除个数 0 个  并且插入在下标1后面添加 你好
console.log( arr1 );// 返回删除项 删除0个[]
  • sort() 排序

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0
若 a 大于 b,则返回一个大于 0 的值

  • 正序 ( 冒泡排序 )
    a - b > 0

  • 倒序 ( 冒泡排序 )
    b - a

var arr = [1, 2, 3, 5, 8, 9, 7, 5, 321]
console.log(arr.sort())// [1, 2, 3, 321, 5, 5, 7, 8, 9]没规定排列排序是按照字符串的Unicode码,321的比后面的小,则他在前面
var arr1 = [1, 2, 3, 5, 8, 9, 7, 5, 321]
console.log(arr1.sort( function(a,b){
	console.log(a-b)
	return a - b}
))//[1, 2, 3, 5, 5, 7, 8, 9, 321]
// return b - a //[321, 9, 8, 7, 5, 5, 3, 2, 1]
  • reverse() 反转数组
var arr = [1,2,3,4,5,6,7,8,9]
console.log(arr.reverse())// [9, 8, 7, 6, 5, 4, 3, 2, 1]
  • slice 切割/截取

原数组不变,返回一个新的数组,包含 start 不包含 end (结束)的数组

var arr = [1,2,3,4,5,6,7,8,9]
console.log(arr.slice(1,8))//2, 3, 4, 5, 6, 7, 8]
  • map

会把数组里的每一项都调用一次回调函数,然后返回新数组

var arr = [1,2,3,4,5,6,7,8,9]
	arr.map( x =>  x * 2)//[2, 4, 6, 8, 10, 12, 14, 16, 18] 数组每一项都执行一次函数
  • forEach

用来处理数组里的每一项

<body>
	<button>1</button>
	<button>2</button>
	<button>3</button>
</body>
<script>
	var btn = [...document.getElementsByTagName('button')]
    console.log(btn)
	btn.forEach(function(val,idx,self){
		val.onclick = function (){
			console.log(idx) //打印出所点击对象对应的下标
		}
	})
</script>
  • filter() 过滤数组

过滤掉给出的条件

var arr = [1,2,3,4,5,6,7,8,9]
        var arr1 = arr.filter(function(x){
            if(x > 5){ 
                return x
            }
        })
        console.log(arr1)// [6, 7, 8, 9]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值