matlab集合操作
C= intersect(A,B) -- 返回A和B的交集(相同元素)
%----C中的元素将会从小到大排序----%
如果A和B都是向量,那么返回A、B中的相同元素
如果A和B都是矩阵,intersect(A,B,\'rows\') 将返回A、B中的相同列
还有一种调用格式:[C,IA,IB] = intersect(A,B);
其中,C为A,B的交集;IA和IB分别为这些元素在A和B中的位置(Index)
------------------------------------------------------------
C = setxor(A,B) -- 返回A和B中互不相同的元素
类似的:[C,IA,IB] = intersect(A,B);
------------------------------------------------------------
C = union(A,B) -- 返回A和B的并集
类似的:[C,IA,IB] = union(A,B);
------------------------------------------------------------
C = setdiff(A,B) -- 返回A中那些不属于B的元素。
类似的:setdiff(A,B,\'row\') [C,IA] = setdiff(A,B)
------------------------------------------------------------
C = unique(A) -- 返回A中没有重复的元素
比如:
>>A=[1,2,1,4,6,3,7,5,9,4]; C = unique(A);
>>c=[1,2,4,5,6,7,9];
类似的:[B,I,J] = unique(A); I和J都是位置(Index)向量
B = A(I); A(J)=B;
------------------------------------------------------------
C = ismember(A,b) -- 判断b是否是A的元素。
ismember返回一个和A长度相同的向量,如果b与A中某个元素相等,
这个返回的向量中相应的位置就是1,其余位置为0 。
g=1;%读取1.txt文件
filename =[my_dir,num2str(fnum(g)),\'.txt\'];
fid=fopen(filename,\'r\');%filename=\'\C\c101.txt\'; 相对路径地址要提前一级,前面加两点
fidout=fopen(\'..\SD\data.txt\',\'w\'); % 创建data.txt文件
%% 读第一行,无视之
firstLine=fgetl(fid);
%% 读第二行,解析为列头
secondLine=fgetl(fid);
%% 读之后的数据行
dataLine=fgetl(fid);%第三行的数据
i=1;
while(dataLine~=-1) % ~feof(fidin) % 判断是否为文件末尾
fprintf(fidout,\'%s\n\n\',dataLine);
% 读取下一行
dataLine=fgetl(fid);
i=i+1;
end
fclose(fidout);
data1=importdata(\'data.txt\');
- 用matlab将数据读excel数据
- 用matlab将数据写入excel中
for i=1:1001
t=tt(i);
yy(i)=eval(y);
end
plot(tt,yy) subs(S)相当于于用值去替换符号表达式中的变量subs(S,OLD,NEW) 表示将符号表达式S中的符号变量OLD替换为新的值NEW。 %%%%%%%%%%%%%%%%%%%%%%%
例如,如果进行求平方操作。为避免循环,对于数组可以进行.^操作。即
a=rand(2,2); a2=a.^2; %完成对数组a中每个元素的平方操作。
a=rand(2,2);b=rand(3,3);c=rand(4,4); 如果需要同时对a,b,c数组进行求平方操作。可以通过arrayfun实现
s(1).f1=rand(2,2);s(2).fl=rand(3,3);s(3).f1=rand(4,4);y=arrayfun(@(x)(x.f1.^2),s,\'UniformOutput\',false)
- fun=@(T,Ef)2.8*10^3*((T/300).^1.5)*exp(300*Ef/(0.026*T))-1.1*10^3*((T/300).^1.5)*exp((-1.17-Ef)*300/(0.026*T))-1.0/(1+2*exp((Ef+0.04)*300/(0.026*T)));
- Ef=arrayfun(@(T) fzero(@(Ef) fun(T,Ef),-0.03),10:5:400);
- plot(10:5:400,Ef)
%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab利用fzero求零点
f = @(x)x.^5-2*x-5; %注意函数的书写格式
z = fzero(f,[-1000 1000])
首先,向量化编程:arrayfun及cellfun函数的使用,来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。而向量化正是Matlab不遗余力追求的核心思想之一。同时,在元素个数不匹配的两个量直接计算时,bsxfun函数得以很好解决。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
简单例子:
y = arrayfun(@(alpha) f1(x,k,alpha), alpha,\'UniformOutput\',false);
其中,x是数据,k是定下来的参数,alpha是待调参数,比如alpha = [1,2,3];
来看一下Faster R-CNN里一个例子:
[anchors, im_scales] = arrayfun(@(x) func(im_size, conf, x, feature_map_size), conf.scales, \'UniformOutput\', false);
func函数的返回值是一个向量,对conf.scales中的每一个元素调用func函数,计算结果放在anchors, im_scales中,生成的anchors, im_scales也都应该是向量。
简单例子:
y = cellfun(@(alpha) f1(x,k,alpha), alpha,\'UniformOutput\',false);
这里与arrayfun不同的是:待定参数alpha是cell,即alpha = {1,2,3}; 那么该例子即可实现输入x,k,alpha(cell量),进行函数f1操作,得到同是y。
来看一下Faster R-CNN里一个例子:
bbox_targets{i} = cellfun(@(x, y) compute_targets(conf, scale_rois(gt_rois, im_size, y), gt_labels, x, image_roidb_cell{i}, y), anchors, im_scales, \'UniformOutput\', false);
查看前后代码:可以找到compute_targets函数定义:
function bbox_targets = compute_targets(conf, gt_rois, gt_labels, ex_rois, image_roidb, im_scale)
同理,cellfun函数即为,将cell里每一个量anchors, im_scales作为输入量替代上式中的x,y位置,进行compute_targets函数操作。
C=bsxfun(fun,A,B)
bsxfun与上述两个函数有一定差异,主要是进行两个数组间元素逐个的计算,如:直接对一个矩阵A的每一列或者每一行与同一个长度相等的 向量 a 进行某些操作。这里的fun主要是函数句柄或者m文件,同时也可以是内置函数:
@plus 加
@minus 减
@times 数组乘
@rdivide 左除,Right array divide
@ldivide 右除,Left array divide
来看一下Faster R-CNN里一个例子:
means = bsxfun(@rdivide, sums, class_counts);
stds = (bsxfun(@minus, bsxfun(@rdivide, squared_sums, class_counts), means.^2)).^0.5;
这里的means得到的结果即为class_counts里每行(列)元素除以sums(A左除B即为 inv(A)*B)。
而这里的stds得到的结果即为class_counts里每行(列)元素除以squared_sums,得到的矩阵的每行(列)数字减去means.^2,得到的矩阵里的一行(列)数再都 .^0.5。
虽然有点绕口,但是很容易理解,就是对于需要操作的A,B矩阵,如果A和B的大小相同,那么直接正常运算。但如果有某维不同,那么bsxfun就将少的这个虚拟的复制一些来使与多的维数一样,完成两个数组间元素不对等时候的逐个元素的计算。
请发表评论