matlab 矩阵矩阵元素替换
急求! 展开
1、首先我们打开matlab,在命令行窗口中输入a=[120155;2407;2300;0000]。
2、输入a(find(a==0))=[],去除掉a矩阵内的0元素。
3、按回车键之后,可以看到已经去除了a矩阵所有的0元素,并变成了1行数据。
4、如果我们想去除矩阵的全0行的话,输入a(all(a==0,2),:)=[]。
5、按回车键之后,可以看到删除了矩阵的第5行全0行。
扩展资料:
在matlab中,矩阵中的元素序号是按照“先行后列”的顺序排列的。设如下随机矩阵:A=rand(4,6)A=0.65510.95970.75130.89090.14930.81430.16260.34040.25510.95930.25750.24350.11900.58530.50600.54720.84070.92930.49840.22380.69910.13860.25430.3500则执行下面命令:A(6)ans=0.3404得到结果很容易看出是按照“先行后列”的排序。其次,对于矩阵中的元素表示方法,主要分以下几点:
1、A(m,n)代表矩阵A中第m行,第n列的值:A(3,4)ans=0.5472。
2、对于矩阵A(m,n)若是m用:代替即A(:,n)代表第n列的元素;若是n用:代替即A(m,:)代表第m行元素;A(2,:)ans =0.1626 0.3404 0.2551 0.9593 0.2575 0.2435若是用[a b c]代替m即A([a b c],n)则表示第a,b,c行,n列中的元素;A(:,6)ans =0.81430.24350.92930.3500若是用[a:b](a<b)代表m即A(a:b,:)
则表示a到b行的所有元素;A(2:4,:)ans=0.16260.34040.25510.95930.25750.24350.11900.58530.50600.54720.84070.92930.49840.22380.69910.13860.25430.3500若是用[abc]代替m,用[xy]代替n即A([abc],[xy])则表示a,b,c行中x,y列中的元素;A([1,3],5)ans=0.14930.8407。
首先编写m函数如下:
function out = replace(w,p)
temp_h=length(w);
l=1;
for k=1:temp_h
if w(k)==1
out(k)=p(l);
l=l+1;
else
w(k)=0;
end
end
end
然后将该m函数放到matlab工作目录下,或改变matlab工作目录到该函数的目录。
在命令空间输入如下命令:
>> m=[0,1,1,0,1];
>> p=[3,5,9];
>> a=replace(m,p)
a =
0 3 5 0 9
看到了吧,a就是m矩阵中将1对应的用p的元素替换后的矩阵。
只能用for循环了么?还有没有其他办法?
矩阵操作的效率确实比for循环的效率高,但是你这个题中矩阵内的规律不是很明显。很难实现矩阵操作。你可以从最原始的算法上改改看。
这里我将我的算法优化了一下,将m函数改写如下:
function out = replace_2(w,p)
temp_1=find(w==1); %找到w中为1的元素标号
temp_2=length(temp_1); %判断为1的元素个数
temp_3=length(w); %判断w的列数
out=zeros(1,temp_3);
for k=1:temp_2
out(temp_1(k))=p(k);
end
end
这个函数for循环的次数为w向量中1的个数,刚刚我给的算法for循环的次数为w的列数。而且还剩去了多次的if判断,可以看出效率可以明显提高。
在命令空间输入以下内容测试:
>> w=[0 1 1 0 0 1 1];
>> p=[1 5 7 3];
>> a=replace_2(w,p)
a =
0 1 5 0 0 7 3
函数功能也可实现。
w=[1 0 1 1 0 0 0 1 1 1 0];
p=[5 6 2 8 9 7];
k=1;%记录p中元素位置
for i=1:length(w)
if w(i)==1
w(i)=p(k);
k=k+1;
end
end
广告 您可能关注的内容 |