难点一:m=[1,2,3;4,5,6;7,8,9;0,0,0]
m =1 2 3 sort(m)=0 0 0
4 5 6 1 2 3
7 8 9 4 5 6
0 0 0 7 8 9
[t,v]=sort(m) %t代表完成默认升序排序的矩阵,v则是代表t中元素在m中的初始位置矩阵
t =0 0 0 v=4 4 4
1 2 3 1 1 1
4 5 6 2 2 2
7 8 9 3 3 3
[~,b]=sort(m) %禁止输出已完成排序的矩阵,只输出位置矩阵
难点二:sortrows
按矩阵某一列进行排序,并且行跟着变动
例如:sortrows(chrom,4) %chrom是3*4矩阵
难点三: p=[1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7];
r=randperm(size(p,2));%size(p,2)=44
随机生成一个1*44的1-44的不重复矩阵
A=p(1,r);%用于打乱p矩阵的排列顺序
r矩阵实质上存放着A矩阵在p矩阵中的位置信息,比如r中第一个数是20,即A中第一个数就是p矩阵中第20个数,以此类推。
难点四:sortrows的缺陷
当指定列包含重复的元素时,sortrows
会基于其他列中的元素进行排序。如果只需单列排序,就会导致排序结果出现错误。
难点五:获取数组非零元素个数
H =[6,5,6,6,7,1,4,5,6,2,2,7,2,6,1,4,3,1,5,6,1,6,2,5,3,5,1,2,1,1,3,4,6,3,1,7,2,3,7,7,4,7,4,7];
aaa = [1 5 3 6 15 99 0 0 0 0 0 0];
count = sum(aaa~=0,2)
技巧1:循环删除矩阵的某一行
倒序循环
问题1:如何将一段数据分为三段
devide = randperm(3,3);
first_num = all_trips(1:devide(1));
second_num = all_trips((size(first_num,2)+1):(size(first_num,2))+devide(2));
third_num = all_trips(NV-devide(3)+1:end);
8、当matlab运行算法时,有错误在迭代次数不确定的情况下出现,处理办法如下:
a.仔细甄别导致错误的子程序位置(程序需要边写边调试)
b.将重要信息作为输入数据依次传递到报错位置,这样就可以在matlab报错时查看相关数据信息,用以确定、仔细甄别导致错误的具体函数
c.将matlab运行模式调整为出现错误时暂停,程序报错后,保存工作区的数据即mat文件
d.在导致错误的函数前一句代码上打上断点(更改输出数据名称),然后运行程序至该断点,加载上一步保存的mat文件(报错后matlab正处于调试状态,可以将函数放在命令行窗口运行一次用以佐证判断)
单步调试,进入该错误函数,进一步解析报错原因。
9、matlab实现数组任意片段中的随机数
a=1:20;
loc_p2 = find(a==8,1);
cur_loc = loc_p2+randperm(size(loc_p2:size(a,2),2),1)-1;
10、unique
a=unique(a,'stable'); %数组第一个值位置不变