matlab中如何利用向量作为矩阵索引访问相应元素

作者&投稿:赖生 (若有异议请与网页底部的电邮联系)
Matlab怎样按索引给矩阵某些位置赋不同的相应值,不用for循环?~

两种方法:
1,将所有要删除的行标顺序排列成向量V,然后用命令
"矩阵变量名"(V,:)=[];%可删除与"矩阵变量名"对应的矩阵中的指定行(通过V指定),并改变原矩阵维数
2,将所有要保留的行标顺序排列成向量V,然后用命令
"矩阵变量名"="矩阵变量名"(V,:);%即将与"矩阵变量名"对应的矩阵中的指定行(通过V指定)重新赋给该变量
删除列类似.

按照你所说A,B有0元素
所以C有0元素(0除以非0)或者inf元素(非零除以0),或者nan元素(0除以0)

要在排序的时候忽略他们,只要将他们改写为一定排不上前100的数就可以了

要找最大的元素的时候,可以将对应的数改为-inf,那么这些数肯定排在最小
要找最小的元素的时候,可以将对应的数给为inf,那么这些数肯定排在最大
数据足够多的时候,前100个数肯定就没有它们的身影

例如在C中忽略nan,找前100个最大的数

D=C;
D(isnan(D))=-inf;
sD=sort(D,'descend'); %降序排序
Result =sD(1:100);


不用用到索引

要忽略某些值,只要让那些等于哪些值的值变为-inf就可以了
忽略inf:D(isinf(D))=-inf;
忽略0:D(D==0)=-inf;

找最小的时候,将这些值给为inf,用升序排列

n维矩阵有两个下标,n维向量只能提供一个下标。当然你可以采用单下标访问方式。
比如A(a)显示的结果是A矩阵的第1,3,4……个元素;
而A(1,a)显示的是A(1,1),A(1,3),A(1,4)……的结果。
Matlab中数组元素引用有三种方法:

1.下标法(subscripts)
2.索引法(index)
3.布尔法(Boolean)

在使用这三种方法之前,大家头脑一定要清晰的记住,Matlab中数组元素是按列存储(与Fortran一样),比如说下面的二维数组

A=
8 1 6
3 5 7
4 9 2

Matlab的存储顺序是8,3,4,1,5,9,6,7,2,也就是说先行后列,对于3维数组呢,就是先行后列再页

对应个元素的索引和下标分别为

Element Index Subscripts
8 1 (1,1)
3 2 (2,1)
4 3 (3,1)
1 4 (1,2)
5 5 (2,2)
9 6 (3,2)
6 7 (1,3)
7 8 (2,3)
2 9 (3,3)

从上面的例子中已经很清晰的说明了下标和索引的区别了,也就是说Matlab为没有个元素分配了一个唯一识别的ID(即index)

1.下标法引用

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 =
8 1 6
3 5 7
4 9 2

>>A(2:3,3:-1:1)

ans =
7 5 3
2 9 4

>>A(:,end)

ans =
6
7
2

>>A(1,end-1)

ans =
1

>>A([2 1 3 3],[1 1 2 2 1])

ans =
3 3 5 5 3
8 8 1 1 8
4 4 9 9 4
4 4 9 9 4

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 =
17 (1) 24 (6) 1 (11) 8 (16) 15 (21)
23 (2) 5 (7) 7 (12) 14 (17) 16 (22)
4 (3) 6 (8) 13 (13) 20 (18) 22 (23)
10 (4) 12 (9) 19 (14) 21 (19) 3 (24)
11 (5) 18 (10) 25 (15) 2 (20) 9 (25)

>>A(8)

ans =
6

>>A([1 10 5 2 2 1 3])

ans =
17 18 11 23 23 17 4

>>A([2 5 9;1 1 1;8 5 6])

ans =
23 11 12
17 17 17
6 11 24

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的数组

A=
8 1 6
3 5 7
4 9 2

>>x=logical([1 1 0;0 1 1;1 0 1])%将double转化为boolean型数据

x =
1 1 0
0 1 1
1 0 1

>>A(x)%引用对应位置为1的数据,返回列向量

ans =
8
4
1
5
7
2

>>x=A>5%是有了比较语句,返回布尔型数据,对应位置数据大于5的为1,否则为0

x =
1 0 1
0 0 1
0 1 0

>>A(x)%返回大于A中大于5的元素,其实该命令可以一次性执行A(A>5)或者find(A>5),前者返回具体元素,后者返回大于5的数据的索引值

ans =
8
9
6
7

>>A(A>5)%一次性执行上面的命令

ans =
8
9
6
7

>>indx=find(A>5)%查找A中对于5的元素,返回它们的索引(index)值,此时我们可以通过A(index)返回具体的元素

index =
1
6
7
8

增加内容
1、向量的创建
1)直接输入:
行向量:a=[1,2,3,4,5]
列向量:a=[1;2;3;4;5]
2)用“:”生成向量
a=J:K 生成的行向量是a=[J,J+1,…,K]
a=J:D:K 生成行向量a=[J,J+D,…,J+m*D],m=fix((K-J)/D)
3)函数linspace 用来生成数据按等差形式排列的行向量
x=linspace(X1,X2):在X1和X2间生成100个线性分布的数据,相邻的两个数据的差保持不变。构成等差数列。
x=linspace(X1,X2,n): 在X1和X2间生成n个线性分布的数据,相邻的两个数据的差保持不变。构成等差数列。
4)函数logspace用来生成等比形式排列的行向量
X=logspace(x1,x2) 在x1和x2之间生成50个对数等分数据的行向量。构成等比数列,数列的第一项x(1)=10x1,x(50)=10x2
X=logspace(x1,x2,n) 在x1和x2之间生成n个对数等分数据的行向量。构成等比数列,数列的第一项x(1)=10x1,x(n)=10x2
注:向量的的转置:x=(0,5)’

2、矩阵的创建
1)直接输入:将数据括在[]中,同一行的元素用空格或逗号隔开,每一行可以用回车或是分号结束
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5

2)函数eye,生成单位矩阵
eye(n) :生成n*n阶单位E
eye(m,n):生成m*n的矩阵E,对角线元素为1,其他为0
eye(size(A)):生成一个矩阵A大小相同的单位矩阵
eye(m,n,classname):对角线上生成的元素是1,数据类型用classname指定。其数据类型可以是:duoble、single、int8、uint8、int16、uint16、int32、uint32 。

3)函数ones 用ones生成全1的矩阵
ones(n) : 生成n*n的全1矩阵
ones(m,n) : 生成m*n的全1矩阵
ones(size(A)) : 生成与矩阵A大小相同的全1矩阵
ones(m,n,p,…)生成m*n*p*….的全1的多维矩阵
ones(m,n,…,classname)制定数据类型为classname

4)函数zeros 函数zeros生成全0矩阵
zeros(n):生成n*n的全0矩阵
zeros(m,n:)生成m*n的全0矩阵
zeros(size(A)): 生成与矩阵A大小相同的全0矩阵
zeros (m,n,p,…)生成m*n*p*….的全0的多维矩阵
zeros (m,n,…,classname)指定数据类型为classname

5)函数rand 函数rand用来生成[0,1]之间均匀分布的随机函数,其调用格式是:
Y=rand:生成一个随机数
Y=rand(n):生成n*n的随机矩阵
Y=rand(m,n):生成m*n的随机矩阵
Y=rand(size(A)):生成与矩阵A大小相同的随机矩阵
Y=rand(m,n,p,…):生成m*n*p*…的随机数多维数组
6)函数randn 函数rand用来生成服从正态分布的随机函数,其调用格式是:
Y=randn:生成一个服从标准正态分布的随机数
Y=randn(n):生成n*n的服从标准正态分布的随机矩阵
Y=randn(m,n):生成m*n的服从标准正态分布的随机矩阵
Y=randn(size(A)):生成与矩阵A大小相同的服从标准正态分布的随机矩阵
Y=randn(m,n,p,…):生成m*n*p*…的服从标准正态分布的随机数多维数组

3、矩阵元素的提取与替换
1) 单个元素的提取
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a(1,2)
b =
2

2) 提取矩阵中某一行的元素,
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a(1,:)
b =
1 2 3

3) 提取矩阵中某一列:
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a(:,1)
b =
1
3

4) 提取矩阵中的多行元素
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a([1,2],:)
b =
1 2 3
3 4 5

5) 提取矩阵中的多列元素
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a(:,[1,3])
b =
1 3
3 5

6) 提取矩阵中多行多列交叉点上的元素
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入b=a([1,2],[1,3])
b =
1 3
3 5

7) 单个元素的替换:
如:a=[1,2,3;3,4,5],运行后:
a =
1 2 3
3 4 5
输入:a(2,3)=-1
a =
1 2 3
3 4 -1

4、矩阵元素的重排和复制排列
1) 矩阵元素的重排
B=reshape(A,m,n):返回的是一个m*n矩阵B,矩阵B的元素就是矩阵A的元素,若矩阵A的元素不是m*n个则提示错误。
B=reshape(A,m,n,p):返回的是一个多维的数组B,数组B中的元素个数和矩阵A中的元素个数相等
B=reshape(A,…,[],…):可以默认其中的一个维数
B=reshape(A,siz) : 由向量siz指定数组B的维数,要求siz的各元素之积等于矩阵A的元素个数

2) 矩阵的复制排列 函数是repmat
B=repmat(A,n):返回B是一个n*n块大小的矩阵,每一块矩阵都是A
B=repmat(A,m,n):返回值是由m*n个块组成的大矩阵,每一个块都是矩阵A。
B=repmat(A,[m,n,p,…]):返回值B是一个多维数组形式的块,每一个块都是矩阵A

5、矩阵的翻转和旋转
1)矩阵的左右翻转 左右翻转函数是fliplr,调用格式:
B=fliplr(A):将矩阵A左右翻转成矩阵B。
输入:A=[1,2,3;3,4,2]
A =
1 2 3
3 4 2
输入:B=fliplr(A)
B =
3 2 1
2 4 3
2)矩阵上下翻转 函数:flipud,调用格式:
B=flipud(A):把矩阵A上下翻转成矩阵B

3) 多维数组翻转 函数:flipdim,调用格式:
B=flipdim(A,dim):把矩阵或多维数组A沿指定维数翻转成B

4) 矩阵的旋转 函数:rot90,调用格式:
B=rot90(A):矩阵B是矩阵A沿逆时针方向旋转90。得到的
B=rot90(A,k):矩阵B是矩阵A沿逆时针方向旋转k*90。得到的(要想顺时针旋转,k取-1)
6、矩阵的生成与提取函数
1) 对角线函数 对角线函数diag既可以用来生成矩阵,又可以来提取矩阵的对角线元素,其调用格式:
a) A=diag(v,k):当v是有n个元素的向量,返回矩阵A是行列数为n+|k|的方阵。向量v的元素位于A的第k条对角线上。K=0 对应主对角线,k>0对应主对角线以上,k<0对应主对角线以下。
b) A=diag(v):将向量v的元素放在方阵A的主对角线上,等同于A=diag(v,k)中k=0的情况。
c) v=diag(A,k):提取矩阵A的第k条对角线上的元素于列向量v中。
d) v=diag(A):提取矩阵A的主对角线元素于v中,这种调用等同于v=diag(A,k)中k=0的情况。
2) 下三角阵的提取 用函数tril,调用格式:
a) L=tril(A): 提取矩阵A的下三角部分
b) L=tril(A,k):提取矩阵A的第k条对角线以下部分。K=0 对应主对角线,k>0对应主对角线以上,k<0对应主对角线以下。
3) 上三角阵的提取 函数triu,调用格式:
a) U=triu(A): 提取矩阵A的上三角部分元素
b) U=triu(A,k): 提取矩阵A的第k条对角线以上的元素。K=0 对应主对角线,k>0对应主对角线以上,k<0对应主对角线以下。

n维矩阵有两个下标,n维向量只能提供一个下标。当然你可以采用单下标访问方式。
比如A(a)显示的结果是A矩阵的第1,3,4……个元素
而A(1,a)显示的是A(1,1),A(1,3),A(1,4)……的结果


怎样顺利安装数学mathlab软件?
ATLAB要用到CPU的数学计算模块,而MATLAB默认的是INTEL的CPU,所以AMD的CPU一般都会遇到安装好后打开自动关闭的问题。 解决办法:先确认安装好后(假如安装在D盘) 在此路径下D:\\MATLAB7\\bin\\win32有一个叫做atlas_Athlon.dll的文件。然后在我的电脑上右击点”属性”,再在”高级”中点”环境变量”,在”系统变量”中...

婺城区19637431169: matlab怎么把行向量转成矩阵向量 -
采供复方: 1、在电脑上打开matlab,在命令行窗口中输入“r = [ 1 2 3 4 ];tr = r'”,其中单引号(')是用于转置操作.2、按回车键之后,可以看到将行向量r转置成为了列向量tr. 3、将列向量转置成为行向量,在命令行窗口中输入“v = [1;2;3;4];tv = v'”. 4、按回车键之后,可以看到将列向量v转置成为了行向量tv. 5、可以对矩阵进行转置,矩阵转置的操作也是通过单引号(')来实现的,在命令行窗口输入命令. 6、按回车键之后,可以看到将a矩阵的每列转置成了b矩阵的每行,a矩阵的每行转置成了b矩阵的每列.

婺城区19637431169: matlab 如何利用向量生成01矩阵,如下图所示 -
采供复方: 比如已知向量是A 要求的矩阵为X 可以写一段小程序 n = length(A); X = zeros(n); for i = 1 : n X(i,A(i)) = 1; end X

婺城区19637431169: matlab中如何利用向量作为矩阵索引访问相应元素 -
采供复方: n维矩阵有两个下标,n维向量只能提供一个下标.当然你可以采用单下标访问方式.比如A(a)显示的结果是A矩阵的第1,3,4……个元素而A(1,a)显示的是A(1,1),A(1,3),A(1,4)…...

婺城区19637431169: matlab怎么把一个行向量变成一个矩阵 -
采供复方: 好像没有直接能变成想要的函数,不过有个变维函数,reshape函数. 另外记住矩阵元素的排列是从上到下,从左倒右的,按照这个规则以及变维函数可以实现想要的功能: >> a=1:6 a = 1 2 3 4 5 6 >> b=reshape(a,3,2)' b = 1 2 3 4 5 6

婺城区19637431169: 求问matlab中怎么把一个向量变成一个上三角矩阵 -
采供复方: z=f(x,y)=y^sinx*ln(x^2+y^2) ∂z/∂x=cosxy^(sinx)lnyln(x^2+y^2)+2xy^sinx/(x^2+y^2) ∂z/∂y=sinxy^(sinx-1)ln(x^2+y^2)+2yy^sinx/(x^2+y^2)

婺城区19637431169: matlab怎么把一个列向量变成一个对角矩阵?列向量的各元素就是对角矩阵对角线上的各元素,对角矩阵其他元素为零,matlb中用什么命令来实现? -
采供复方:[答案] A=diag(b,n) b为列向量.n为零时或不指定是为主对角线.你的问题 A=diag(b) 就行

婺城区19637431169: Matlab把一个向量变成一个列矩阵怎么做 -
采供复方: 是不是就是转置 A' 就行

婺城区19637431169: matlab中如何将一个二进制向量按位拆为矩阵形式? -
采供复方: B是字符串形式的吗?如果是这样就可以: B=['0101';'0000';'1010';'1111'] B =0101000010101111>> B-48 ans = 0 1 0 1 0 0 0 0 1 0 1 0 1 1 1 1

婺城区19637431169: 如何在matlab中建立向量和矩阵 -
采供复方: 1、向量的创建1)直接输入:行向量:a=[1,2,3,4,5]列向量:a=[1;2;3;4;5]2)用“:”生成向量a=J:K 生成的行向量是a=[J,J+1,…,K]a=J:D:K 生成行向量a=[J,J+D,…,J+m*D],m=fix((K-J)/D)3)函数linspace 用来生成数据按等差形式排列的行...

婺城区19637431169: 怎样用matlab 向量每个元素与另外向量的所有元素合并成矩阵? -
采供复方: >> a=[1,2,3]; b=[4,5];c=[ 1 4; 1 5;2 4; 2 5; 3 4; 3 5] c =1 41 52 42 53 43 5 >> c1=repmat(a,size(b)),c2=repmat(b,size(a)) c1 =1 2 3 1 2 3 c2 =4 5 4 5 4 5 >> c3=[c1' c2'] c3 =1 42 53 41 52 43 5

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网