Matlab 使用小记

来源:互联网 发布:双防火墙网络环境搭建 编辑:程序博客网 时间:2024/06/01 19:36

前几天杂七杂八学的东西,记下来方便查阅。

以下转自:MATLAB中的排序函数_beer_新浪博客

sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。sort(A)是默认的升序,而sort(A,'descend')是降序排序。
sort(A)若A是矩阵,默认对A的各列进行升序排列
sort(A,dim)
dim=1时等效sort(A)
dim=2时表示对A中的各行元素升序排列

看下面的例子

 

>> A=magic(3)
A =
8 1 6
3 5 7
4 9 2

>> sort(A)
ans =
3 1 2
4 5 6
8 9 7

>> sort(A,1)
ans =
3 1 2
4 5 6
8 9 7

>> sort(A,2)
ans =
1 6 8
3 5 7
2 4 9

===================

Matlab中给一维向量排序是使用sort函数:sort(A),排序是按升序进行的,其中A为待排序的向量;若欲保留排列前的索引,则可用 [sA,index] = sort(A) ,排序后,sA是排序好的向量,index 是 向量sA 中对 A 的索引。 索引使排列逆运算成为可能。

事实上,这里sA(index) , [A恒等于sA(index)],这个结论确实很奇妙,而且很有用。不信你排序之后试下键入命令sA(index) ,看看得到的是不是就是排列前的A呢。

注:这里结论可能有误,网上也都按原文这么说的,但我的测试结果是:sA=A(index)

=====================

  在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可,如 果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A中 项的索引。排序是安升序进行的。
  
  在Matlab中,访问矩阵中的元素,一维用A(1)访问向量A的第一个元素;(下标从1开始);二维用A(1,2)访问A中第一行,第二列的元素。
  
  由于在sort函数的结果中,是安升序排序的,要转换成降序,先用X=eye(n)生成一个n维的单位阵,然后用X=rot90(X)将其旋转为次对角线的单位阵,再用原来矩阵乘以X即可,如要讲A逆序排列采用如下步骤:
  
  X=eye(size(A));
  X=rot90(X);
  A=A*X;
  
  假如a是一个2*n的矩阵,即两行.
  b=a(1,:);
  [c,pos]=sort(b);%pos为排序后的下标,c为第一行的排序结果;
  a(2,:)=a(2,pos);%第二行按照第一行排序的下标对应
  a(1,:)=c;%第一行结果重新赋给a 的第一行
  
  以下适用于m*n的矩阵按第一行排序
  [ b, pos ] = sort( a( 1, : ) );
  a = a( :, pos );

=======================

matlab按某一列排序,其他列不变办法

b=sortrows(a,2)    %a 为要排序的矩阵。2表示按第几列进行排序,整数代表升序,负数代表降序。
%将矩阵a按照第2列的升序排列,其他列不会作升序排列,而是将跟随着第2列 的变化,保持一一对应。

b=sortrows(a,-3)
%将矩阵a按照第3列的降序排列,其他列将跟随着第3列 的变化,保持一一对应。

data =
             2
             5
             8

sortrows(data,1)
ans =
             2
             8
             5

sortrows(data,-1)
ans =
             5
             8
             2


以下摘自:MATLAB中快速交换行或者列中的值 - Lemniscate的日志 - 网易博客

这个小技巧是在查看MATLAB的文档中发现的,使用这种方法不需要引入临时变量。以前看教材的时候没有注意,今天看代码很不理解,测试了一下才知道的。

例如有矩阵:

A = 
     1     2     3     4 
     5     6     7     8 
     9    10    11    12 
    13    14    15    16

使用命令:

A([1;3],:)=A([3;1],:)

将实现1,3行的交换。

A = 
     9    10    11    12 
      5     6       7      8 
      1     2       3      4 
    13    14    15   16

当然不用整行交换也是可以的,例如

A([1;3],[2 4])=A([3;1],[2 4])

将交换矩阵A的第1行、第1行中列为2和4的值,对于最开始的矩阵,

n=4; 
A=reshape(1:n*n,n,n)' 
A([1;3],[2 4])=A([3;1],[2 4])

输出结果是:

A = 
     1     2     3     4 
     5     6     7     8 
     9    10    11    12 
    13    14    15    16 
A = 
     1    10     3   12 
     5     6     7     8 
     9     2    11    
    13    14    15    16 

最后,既有行又有列的交换可以一次完成,例如:

n=4; 
A=reshape(1:n*n,n,n)' 
A([1;3],[1;3])=A([3;1],[3;1])

输出的结果是:

A = 
     1     2     3     4 
     5     6     7     8 
     9    10    11    12 
    13    14    15    16 
A = 
    11     2    9     4 
     5     6     7     8 
     3    10     1    12 
    13    14    15    16 
这个操作可以这么理解,是先交换了1,3行中位于1和3列的值,这个中间结果是: 
    9     2     11     4 
     5     6     7     8 
     1    10   3    12 
    13    14    15    16

然后再交换1,3列中位于1和3行中的值,就是最后的结果。

常用集合运算

a=[1,2,3,4,5,6,7,8,9];b=[1,4,6,9,12,14];
>> c=intersect(a,b)

c =

     1     4     6     9

其他常用参见:http://www.docin.com/p-281901213.html

matlab中corrcoef函数

%可以计算两组数据的相关系数
 
>> a=[0.6557,0.0357,0.8491,0.9340,0.6787];
b=[0.7315,0.1100,0.8884,0.9995,0.6959];
corrcoef(a,b)
 
ans =    1.0000    0.9976    0.9976    1.0000
 
% 第一个1是a与a的相关系数,左边第一个0.9976是a与b相关系数,第二个0.9976是b与a相关系数,第二个1是b与b的相关系数

将matlab工作空间的数据导出到excel

转自:http://zhidao.baidu.com/link?url=PvIt0y3jcYiBfi_L69VSTuEvqXKehPqJRXIfSG-aXSLDf5ycdUpkGiORXPJoKPCTWww4BfYAsMbAQKocSPMYBq

可以直接在m文件里面用xlswrite函数:(filename/sheet/range都是要加单引号滴)
xlswrite(filename, M);将矩阵M的数据写入名为filename的Excel文件中。
xlswrite(filename, M, sheet);将矩阵M的数据写入文件名为filename中的指定的sheet中。
 xlswrite(filename, M, range);将矩阵M中的数据写入文件名为filename的Excel文件中,且由range制定存储的区域,例如'C1:C2'.
 xlswrite(filename, M, sheet, range) ;在上一条命令的基础上指定了所要存储的sheet。
status = xlswrite(filename, ...) ;返回完成状态值。如果写入成功,则status为1;反之写入失败,则status为0.
 [status, message] = xlswrite(filename, ...);返回由于写入操作而产生的任何错误或警告信息


应用举例
例一:将数据写入默认的工作表中 
将一七元素向量写入testdata.xls中。默认格式下,数据将写入文件中第一个工作表的A1至G1单元格。 xlswrite('testdata.xls', [12.7 5.02 -98 63.9 0 -.2 56])
 
例二:将混合数据写入制定工作表中
d = {'Time', 'Temp'; 12 98; 13 99; 14 97};
s = xlswrite('tempdata.xls', d, 'Temperatures', 'E1')
s =
1
 
Time Temp
12 98
13 99
14 97


例三:向文件中添加新的工作表
现将上例中的数据写入tempdata.xls中并不存在的一个工作表中,在这种情况下,xlswrite会添加一个新的工作表,名称由用户指定,此时xlswrite会显示警告提示添加了新的工作表。xlswrite('tempdata.xls', d, 'NewTemp', 'E1')
Warning: Added specified worksheet. 
如果不想看到这些警告,可以输入下列命令。 
warning off MATLAB:xlswrite:AddSheet
再一次输入写入命令,这次创建另外一个新的工作表NewTemp2,此时不再显示提示信息,但仍可以用msg命令提取该信息。
[stat msg] = xlswrite('tempdata.xls', d, 'NewTemp2', 'E1');
msg
msg =
message: 'Added specified worksheet.'
identifier: 'MATLAB:xlswrite:AddSheet' book.

0 0
原创粉丝点击