◆技术求助◆我的暗夜精灵2Pro麦克风阵列技术没

MATLAB中的结构数组
结构数组:
&&&&结构是包含一组记录的数据类型,而记录则是存储在相应的字段中。结构的字段可以是任意一种MATLAB数据类型的变量或者对象。结构类型的变量也可以是一维的、二维的或多维的数组。结构数组也称为架构数组。不过,在访问结构类型数据的元素时,需要使用下标配合字段的形式。
&&&&可以在一个数组中放置各类的数据,并且一个结构数组还能是另一个结构数组的一部分。相比较而言,比元胞数组更为强大,也更加富于变化。
&&&&(1)直接赋值法创建结构数组
&& employee.name='tiger';
&& employee.sex='male';
&& employee.age='24';
&& employee.number='12345';
&& employee
employee =
name: 'tiger'
sex: 'male'
&&& number:
&&&&&employee是一种结构。可以容纳更多的元素,可以自由地向结构中加入元素。
&& employee(2).name='lee';
&& employee(2).sex='female';
&& employee(2).age='32';
&& employee(2).number='82356';
&& employee(2)
name: 'lee'
sex: 'female'
&&& number:
& employee
employee =
1x2 struct array with fields:
&&& number
& (2)用struct函数创建结构数组
&&使用struct函数,可以根据指定的字段及其相应的值创建结构体数组。此函数的一般形式为:
&&str_array=struct('field1',{val1},'field2',{val2}...);
&&(3)结构数组中的数据获取
&&使用结构数组索引,能获取结构数组中的任何字段值或字段元素。相似地,可以给任何字段或字段单元赋值。在结构数组名后面添加索引范围,可以获取子数组。
&& list.ID=123;
&& list.sex='male';
&& list.age=25;
&&& age: 25
&& list(2).ID=456;
&& list(2).sex='female';
&& list(2).age=32;;
&& list2=list(1:2)
1x2 struct array with fields:
&& list2(1)
&&& age: 25
&& str=list2.sex
&& ages=[list.age]
(4)结构数组中的操作
对于结构的基本操作其实是对结构数组元素包含记录的操作。主要有结构记录数据的访问、字段的增加和删除等。访问结构数组元素包含记录的方法很简单,直接使用结构数组的名臣和字段的名臣以及操作符“.”完成相应的操作即可。不过,在访问结构数组的元素时,可以使用所谓的“动态”字段的形式。
Struct_name.(expression)
student=struct('name',{'aaa','bbb'},'age',{23,24},'ID',{001,002},'score',{rand(3)*10,rand(3)*10});
&& student
1x2 struct array with fields:
&& student(2).score
&& student(1).score(1,:)
&& student.name
&& student.('name')
(5)结构操作函数
struct:创建结构或将其他数据类型转变成结构
fieldnames:获取结构的字段名称
getfield:获取结构的字段数据
setfield:设置结构的字段数据
rmfield:删除结构的指定字段
isfield:判断给定的字符串是否为结构的字段名称
isstruct:判断给定的数据对象是否为结构类型
orderfields:将结构字段排序
(6)结构数组的大小
使用size函数可以获取结构数组或任何结构字段的大小。给定一个结构数组名作为变量,size返回一个数组的维向量。给定array(n).field形式的变量,size函数返回一个包含字段内容大小的向量。
(7)结构数组的嵌套
一个结构字段能包含另外一个结构,甚至是另外的结构数组。一旦创建了一个结构,就可以使用struct函数或赋值语句,在已经存在的结构字段中嵌套结构。
&&&&要创建嵌套的的结构有两种方法:一维勇struct函数创建嵌套结构;二是索引嵌套的结构:
&&&&struct函数创建嵌套结构:
&& A=struct('data',[1 2 3;4 5
6],'nest',struct('testnum','test','xdata',[7 8 9],'ydata',[10 11
&&& data: [2x3
&&& nest: [1x1
&&&&添加元素
&& A(2).data=[1 3 3;4 5 5];
&& A(2).nest.testnum='test2';
&& A(2).nest.xdata=[4 3 2];
&& A(2).nest.ydata=[6 9 8];
&&& testnum:
xdata: [7 8 9]
ydata: [10 11 12]
&&& testnum:
xdata: [4 3 2]
ydata: [6 9 8]
要索引嵌套的结构,用.标记添加嵌套的字段名。索引表达式中的第一个文本字符串确认结构数组,后面的表达式获取包含其他结构的字段名。
A(1).nest
A(2).nest.xdata
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。matlab多维数组操作
1.一个三维数组由行、列和页三维组成,其中每一页包含一个由行和列构成的二维数组。
2.利用标准数组函数创建多维数组
A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand和randn等函数有相似的用法。
3.利用直接索引方式生成多维数组
& A=zeros(2,3)
A(:,:,2)=ones(2,3)
& A(:,:,3)=4
上面的代码先生成一个二维数组作为三维数组的第一页,然后通过数组直接索引,添加第二页、第三页。
4.利用函数reshape和repmat生成多维数组
B=reshape(A,2,9)
B=[A(:,:,1) A(:,:,2)
A(:,:,3)]& %结果与上面一样。
reshape(B,2,3,3)
reshape(B,[2 3
3])&&&&&&&&&&&&&
%结果与上面一样。
提示:reshape函数可以将任何维数的数组转变成其他维数的数组。
5.利用repmat函数生成多维数组
C=ones(2,3)
repmat(C,[1 1
3]) % repmat写出类似reshape的repmat(C,1,1,3)将显示出错
提示:repmat是通过数组复制创建多维数组的,上面的代码即是将数组C在行维和列维分别复制一次,然后再页维复制三次得到2&3&3的三维数组。
6.利用cat函数创建多维数组
a=zeros(2);
b=ones(2);
c=repmat(2,2,2);
D=cat(3,a,b,c)%创建三维数组
D=cat(4,a,b,c)&
%创建4维数组。
D(:,1,:,:)&&&&&
%查看第一列的数据。
size(D)&&&&
%可以知道数组D的具体维数。
6.数组运算与处理
数组之间的运算要求两个数组在任何一维都必须具有相同的大小。
(1)squeeze函数用于删除多维数组中的单一维(即大小为1的那些维)
E=squeeze(D)&
size(D) E的数据和D一样,但比D少了一维,只有2行、2列和3页。
(2)reshape函数可以将一个三维向量变成一维向量。
&v(1,1,:)=1:6
squeeze(v)
(3)reshape函数用于改变多维数组的行、列、页以及更高阶的维数,但不改变数组元素的总个数。
F=cat(3,2+zeros(2,4),ones(2,4),zeros(2,4))
G=reshape(F,[3,2,4])
H=reshape(F,[4 3
2])& 或K=reshape(F,2,12)
多维数组的重组按这样的顺序:第一页的第一列、第二列……,第二页的第一列、第二列……。
7.sub2ind函数和ind2sub函数用于多维数组的直接引用,索引顺序与重组顺序一致。
&sub2ind(size(F),1,1,1)&
%求第1行、第1列、第1页的数值的单一索引
&sub2ind(size(F),1,2,1)
&%求第1行、第2列、第1页的数值的单一索引
sub2ind(size(F),1,2,3)
&%求第1行、第2列、第3页的数值的单一索引
p]=ind2sub(size(F),19) %由单一索引求其对应的行列页数值。
8.函数flipdim用于多维数组的翻转,相当于二维数组中的flipud和fliplr函数。例如下面的代码进行按行、列和按页翻转。
M=reshape(1:18,2,3,3)&
flipdim(M,1)
&%每一页中的行翻转
flipdim(M,2)
&%每一页中的列翻转
flipdim(M,3)
&%将第一和第三页翻转调换
9.函数shiftdim用于循环轮换一个数组的维数。如果一个数组r行、c列和p页,则循环轮换一次,就生成一个c行、p列和r页的数组。
shiftdim(M,1) %轮换一次
shiftdim(M,2) %轮换两次
数组轮换后规律很难直观理解,我们可以将三维数组看成一个类似魔方的方形盒子
函数shiftdim也支持负的循环轮换次数。执行该轮换时,数组的维数增加,并且多出的维数均为单一维。
shiftdim(M,-1)
size(ans).
10.函数permute和ipermute用于实现多维条件下的转置操作。从本质上讲permute函数是shiftdimhas函数的扩展。
permute(M,[2 3 1])
shiftdim(M,1)&&&&
%两者结果一样
permute函数中的参数[2 3
1]表示使函数第二维成为第一维,第三维成为第二维,第一维成为第三维。
permute(M,[2 1 3])
3]表示将数组的行列相互转置,页保持不变(只在第一和第二维转置)。
permute函数的第一个参数为待转置的数组,第二个参数为转置顺序,它必须是待转置的多维数组的维数的某种排列,否则所进行的转置无法进行。
permute函数也可以用来将一个数组变成更高维的数组,例如shiftdim(M,-1)也可以用permute函数来实现。
permute(M,[4 1 2 3])
因为任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单一维数。例如二维数组具有页这一维,只是只有一页。总之超过数组本身大小的维数都是单一维。M是一个三维数组,其第四维必为单一维,因此将M的第四维与第一维转置,第一维变成了单一维。
12.二维数组两次转置变换回原来的形式,对于多维数组,用函数ipermute来取消permute所执行的转置操作。
& M %重新调用
permute(M,[3 2 1])
ipermute(M,[3 2 1]) %在我的Matlab上运行没有达到预期效果
13.size函数返回数组每一维的大小
numel函数返回数组的总元素个数
当不指定size的返回值时,将返回一个由数组的各维数组成的向量。当我们知道数组的维数时,可以将维数返回到指定变量中。
p]=size(M)
r=size(M,1)
c=size(M,2)
p=size(M,3)
v=size(M,4)
当一个数组的维数或者某数组维数不确定时,可以利用函数ndims获得数组的维数值。例如:ndims(M),与length(size(M))等效。
&多维数组常用函数:
ones(r,c,…),zeros(r,c,…)
rand(r,c,…),randn(r,c,…)
创建多维数组的基本函数,分别创建全1、全0.随机(0-1之间)和随机正态分布的多维数组。
reshape(B,2,3,3)
reshape(B,[2 3 3])
将一个数组变形成任意维数的数组
repmat(C,[1 1 3])
将一个数组复制成一个任意维数的数组
cat(3,a,b,c)
沿着一个指定的维将数组连接起来
squeeze(D)
删除大小等于1的维,即单一维。
sub2ind(size(F),1,1,1)
[r,c,p]=ind2sub(size(F),19)
将下标转化为单一索引值
将单一索引值转化成下标
flipdim(M,1)
沿着一个指定的维轮换顺序。等效于二维数组中的flippud和fliplr函数
shiftdim(M,2)
循环轮换。第二个参数为正的情况下,进行各维的循环轮换;若为负数,将数组的维数增加。
permute(M,[2 1 3])
iprmute(M,[2 1
多维数组的转置操作,前者为转置操作,后者为取消转置操作。
[r,c,p]=size(M)
返回各维的大小
r=size(M,1)
c=size(M,2)
p=size(M,3)
ndims(M)
获取数组的维数
numel(M)
获取数组的元素总个数
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 麦克风降噪技术 的文章

 

随机推荐