如何从二维数组变一维数组中抽出一列或一行作为一维数组

1.Matlab中数组元素引用有三种方法
1.下标法(subscripts)
2.索引法(index)
3.布尔法(Boolean)
注意:在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组
Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页对应个元素的索引和下标分别为
Element Index Subscripts
  从上面的例子中已经很清晰的说明了下标和索引的区别了,也就是说Matlab为每个元素分配了一个唯一识别的ID(即index)
2.下标法引用A(ii,jj):其中ii和jj可以是一维向量、标量、&:&号或者&end&大家对下标估计比较熟悉,由于在C语言中接触过,但是我这里需要强调的是,Matlab的下标是可以多行多列同时引用的,而像C语言等一次只能引用一个,比如
A(2:3,3:-1:1)表示引用数组中的2~3行,3~1列对应的元素
A(:,end)表示引用最后一列元素,&:&表示所有列或行,&end&表示最后一列或列,&end-n&表示倒数第n行或列
A(1,end-1)表示引用第1行倒数第2个元素
A([2 1 3 3],[1 1 2 2 1])表示引用按两个向量引用指定的元素,即A中的第2,1,3,3行和第1,1,2,2,1列对应的元素
举几个例子:
&&A=magic(3)
&&A(2:3,3:-1:1)
&&A(:,end)
&&A(1,end-1)
&&A([2 1 3 3],[1 1 2 2 1])
2.索引法引用(说白了索引就是存储顺序)A(index):index可以是任意的数组,index的元素必须是正整数,且不大于numel(A),返回的是一个尺寸与index一样的数组下标和索引之间可以通过ind2sub和sub2ind函数相互转换,具体可以看帮助,很简单[I,J] = ind2sub(siz,IND)IND = sub2ind(siz,I,J)还有使用A(:)就可以将数组A转换为列向量A(8):表示引用A的第8个元素B=A([1 10 5 2 2 1 3]):表示依次引用A的第1,10,5,2,2,1,3个元素,返回与index尺寸相同的数组,也就是说size(B)=size(index)A([2 5 9;1 1 1;8 5 6]):返回的时侯是一个3*3的矩阵
&&A=magic(5)%括号中为索引值
&&A([1 10 5 2 2 1 3])
&&A([2 5 9;1 1 1;8 5 6])
3.布尔法引用A(X):X是一个有0和1组成布尔型数据,且size(A)=size(X),对应位置为1则留下该数据,0则去掉,最后按A中的存储顺序,返回一个列向量假如说A是3*3的数组A(logical([1 0 0;0 1 0;0 0 1])):表示引用了数组A的对角线元素,注意必须使用logical将0/1数组转换为布尔型
&&A=magic(3)%生成一个3*3的数组
&&x=logical([1 1 0;0 1 1;1 0 1])%将double转化为boolean型数据
&&A(x)%引用对应位置为1的数据,返回列向量
&&x=A&5%是有了比较语句,返回布尔型数据,对应位置数据大于5的为1,否则为0
&&A(x)%返回大于A中大于5的元素,其实该命令可以一次性执行A(A&5)或者find(A&5),前者返回具体元素,后者返回大于5的数据的索引值
&&A(A&5)%一次性执行上面的命令
&&indx=find(A&5)%查找A中对于5的元素,返回它们的索引(index)值,此时我们可以通过A(index)返回具体的元素
阅读(...) 评论()二维数组中的查找 之 二分法 - justjavac(迷渡) - ITeye技术网站
博客分类:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;
如果查找数字5,由于数组不含有该数字,则返回false。
我的解题思路是这样的矩阵行列都是从小到大排好序的,要查找的话自然用二分效率比较高,
而且这样的矩阵有个性质,最左上角的元素必定是最小值,最右下角的是最大值,在一个
n*n的矩阵中,对角线的元素也是排好序的,找到对角线上的一个元素,使得这个元素小于
待查找的key,并且下一元素大于待查找的key,那么只要在这个元素的左下角矩阵和右上角
矩阵递归继续对角线查找就可以了,例如上图例子里查找7,只要找到对角线的元素4,然后
递归查找红圈的矩阵就可以了,左上角矩阵最大值4&7,右下角
矩阵最小值10&7,无需查找了,但是此题并没有告诉我们原始矩阵是n*n的,这是比较麻烦的
地方,不过思路是一样的,无非不能用对角线查找这样简单的办法了,假设m*n的矩阵,对角线
查找的办法改进为i = (m1+m2)/2,j = (n1+n2)/2 进行查找就可以了,(m1,n1)为矩阵最左上角
元素下标,(m2,n2)为最右下角元素下标
假设查找17,第一次比较10,然后比较25,然后比较13,返回元素13,这时候再递归查找13
左下角的矩阵和右上角的矩阵就可以了(红色椭圆部分);如果是查找9,第一次比较10,然后比较4,
然后比较6,返回元素6,这时候递归查找6左下角的矩阵和右上角矩阵(绿色椭圆部分)
代码如下:
a是二维数组首地址,(m1, n1)左上角坐标,(m2, n2)右下角坐标,参数n是矩阵一行的元素个数
int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2)
int begin_m1 = m1, begin_n1 = n1, end_m2 = m2, end_n2 = n2;
int left_result = 0,
right_result = 0;
int i = (m1+m2)/2, j = (n1+n2)/2;
if (a == NULL)
if (value & *(a+m1*n+n1) || value & *(a+m2*n+n2))
else if (value == *(a+m1*n+n1) || value == *(a+m2*n+n2))
while ((i!=m1 || j!=n1) && (i!=m2 || j!=n2)){
if ( value == *(a+i*n+j) )
else if ( value & *(a+i*n+j) ){
i = (i+m1)/2;
j = (j+n1)/2;
i = (i+m2)/2;
j = (j+n2)/2;
//search left & right
if ( i&end_m2 )
left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);
if ( j&end_n2 )
right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);
if (left_result | right_result )
浏览: 3794400 次
来自: 天津
浏览量:11242
好文章,点赞的时间有点晚了,对不起
启发很大,不只是定点数。谢谢你。
博主,我一步一步跟着走,确实生成了views,但是在主页点链接 ...
学习能力考查确实最重要,但是开发软件的时候,解决问题的能力都只 ...帐号:密码:下次自动登录{url:/nForum/slist.json?uid=guest&root=list-section}{url:/nForum/nlist.json?uid=guest&root=list-section}
贴数:8&分页:没有昵称发信人: henanboy (henanboy), 信区: VI
标&&题: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Wed Jan&&7 21:14:35 2004), 转信 && labview里那个转置的函数只能转二维数组
只有一行的一维数组它不认啊
-- &&&&&&&&&&爱一个人不一定要拥有,但拥有一个人就一定要好好爱她 &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.68.6.*]
御谐发信人: auyuxie (御谐), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Thu Jan&&8 01:11:03 2004) && 既然是向量,行和列一回事啊。为什么非要转置呢?LV是基于C的,C里面的数组(矩阵)
都是按行储存的,但是MATLAB是基于FORTRAN,数组则是按列储存的。
【 在 henanboy (henanboy) 的大作中提到: 】
: labview里那个转置的函数只能转二维数组
: 只有一行的一维数组它不认啊
: 怎么办?
&& -- && ※ 来源:·BBS 水木清华站 ·[FROM: 131.204.193.*]
没有昵称发信人: henanboy (henanboy), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Thu Jan&&8 16:54:43 2004), 转信 && 我是想把横的向量作为横坐标
另外一个向量作为纵坐标在WAVEFORM里面画成图线
所以我打算把它们组合在一个矩阵里,也就是N*2矩阵了,然后连接到WAVEFORM的输入端
不知道还有没别的好方法
【 在 auyuxie (御谐) 的大作中提到: 】
: 既然是向量,行和列一回事啊。为什么非要转置呢?LV是基于C的,C里面的数组(矩阵)
: 都是按行储存的,但是MATLAB是基于FORTRAN,数组则是按列储存的。
&&&& -- &&&&&&&&&&爱一个人不一定要拥有,但拥有一个人就一定要好好爱她 &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.68.12.*]
&发信人: pdemb (虚函数), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Thu Jan&&8 17:53:28 2004) && 转置
【 在 henanboy (henanboy) 的大作中提到: 】
: 我是想把横的向量作为横坐标
: 另外一个向量作为纵坐标在WAVEFORM里面画成图线
: 所以我打算把它们组合在一个矩阵里,也就是N*2矩阵了,然后连接到WAVEFORM的输..
: 不知道还有没别的好方法
: 【 在 auyuxie (御谐) 的大作中提到: 】
: : 既然是向量,行和列一回事啊。为什么非要转置呢?LV是基于C的,C里面的数组(..
: : 都是按行储存的,但是MATLAB是基于FORTRAN,数组则是按列储存的。
:&& && -- && ※ 来源:·BBS 水木清华站 ·[FROM: 218.61.123.*]
&该干啥干啥发信人: happyws (做一个厚道的人), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Thu Jan&&8 17:57:06 2004), 转信 &&&& 【 在 henanboy (henanboy) 的大作中提到: 】
: 我是想把横的向量作为横坐标
&& ~~~~~~~~~~~~~~~~~~~~~~~~~~等间隔否?
: 另外一个向量作为纵坐标在WAVEFORM里面画成图线
: 所以我打算把它们组合在一个矩阵里,也就是N*2矩阵了,然后连接到WAVEFORM的输入端
: 不知道还有没别的好方法
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && I Am Alpha and Omega,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& The Beginning and the End, The First and the Last... &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.62.*]
爱生活,爱老婆发信人: wisejun (阿博博弈萨姆索), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Thu Jan&&8 19:48:20 2004), 转信 && 用XYGraph画图啊,我就是这么用的
横坐标一个一维数组,纵坐标一个一维数组。 &&&& 【 在 henanboy (henanboy) 的大作中提到: 】
: 我是想把横的向量作为横坐标
: 另外一个向量作为纵坐标在WAVEFORM里面画成图线
: 所以我打算把它们组合在一个矩阵里,也就是N*2矩阵了,然后连接到WAVEFORM的输入端
: 不知道还有没别的好方法
虚拟仪器、虚拟现实、虚拟……
啥时把咱也给虚拟了吧? &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.202.64.*]
御谐发信人: auyuxie (御谐), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Fri Jan&&9 00:11:10 2004) && Please combine the two vestors by using&&cluster Bundle VI (X is the first and &&Y is the second) and connect the cluster to a XY gragh.&& && 【 在 henanboy (henanboy) 的大作中提到: 】
: 我是想把横的向量作为横坐标
: 另外一个向量作为纵坐标在WAVEFORM里面画成图线
: 所以我打算把它们组合在一个矩阵里,也就是N*2矩阵了,然后连接到WAVEFORM的输..
: 不知道还有没别的好方法
: 【 在 auyuxie (御谐) 的大作中提到: 】
: : 既然是向量,行和列一回事啊。为什么非要转置呢?LV是基于C的,C里面的数组(..
: : 都是按行储存的,但是MATLAB是基于FORTRAN,数组则是按列储存的。
:&& && -- && ※ 来源:·BBS 水木清华站 ·[FROM: 131.204.193.*]
该干啥干啥发信人: happyws (做一个厚道的人), 信区: VI
标&&题: Re: 请问如何把一个一行的数组转置成一列的数组呢?
发信站: BBS 水木清华站 (Fri Jan&&9 00:23:19 2004), 转信 && 他想用waveform graph
【 在 auyuxie (御谐) 的大作中提到: 】
: Please combine the two vestors by using&&cluster Bundle VI (X is the first and
:&&Y is the second) and connect the cluster to a XY gragh.&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& && I Am Alpha and Omega,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& The Beginning and the End, The First and the Last... &&&& ※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.170.*]
文章数:8&分页:
抽奖到手软!将狂欢进行到底!

我要回帖

更多关于 一维数组 二维数组 的文章

 

随机推荐