• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

matlab集合处理,及数据(文件)存取

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
matlab读取txt文件:

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数据
    [data,text] =xlsread(\'\data\101.xls\',\'Sheet1\',\'B2:D10\'); %读取excel文件
  • 用matlab将数据写入excel中   
     xlswrite(\'filename.xls\', eye(3), sheet, range)
    例:xlswrite(\'E:\text.xls\',M,sheet,\'A2\')   M为要写入的数据,可以是矩阵也可以是cell类型
 
%%%%%%%%%%%%%%% 
st=ArrT(Tabu==1); %查找序号
 
 %%%%%%%%%%%%%%% 
eval(s) 把字符串s的内容当作语句来执行
eval 一个经常用到的地方就是 将一些[符号表达式] 转换为 [数值]结果,
 
例子:
y=dsolve(\'D3y=D2y-Dy-y+t^2\',\'y(0)=0\',\'Dy(0)=1\',\'D2y(0)=-1\');
tt=linspace(0,10,1001); %表示t从0到10
for i=1:1001
t=tt(i);
yy(i)=eval(y);
end
plot(tt,yy)
 
subs(S)相当于于用值去替换符号表达式中的变量
subs(S,OLD,NEW) 表示将符号表达式S中的符号变量OLD替换为新的值NEW。
 
 %%%%%%%%%%%%%%%%%%%%%%%
 arrayfun函数用于对数组中每个元素进行相同的函数操作。
例如,如果进行求平方操作。为避免循环,对于数组可以进行.^操作。即
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)

 

  1. 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)));
  2. Ef=arrayfun(@(T) fzero(@(Ef) fun(T,Ef),-0.03),10:5:400);
  3. plot(10:5:400,Ef)

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%

matlab利用fzero求零点

f = @(x)x.^5-2*x-5; %注意函数的书写格式

z = fzero(f,[-1000 1000]) 


首先,向量化编程:arrayfun及cellfun函数的使用,来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。而向量化正是Matlab不遗余力追求的核心思想之一。同时,在元素个数不匹配的两个量直接计算时,bsxfun函数得以很好解决。

 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

arrayfun

简单例子:

 

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也都应该是向量。

 

cellfun

 

简单例子:

 

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函数操作。

 

bsxfun

 

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就将少的这个虚拟的复制一些来使与多的维数一样,完成两个数组间元素不对等时候的逐个元素的计算。





鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
matlab处理dat数据发布时间:2022-07-18
下一篇:
MATLAB中用cellfun函数处理cell数据发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap