Matlab笔记

>> m = rand(4,4)

m =

    0.8147    0.6324    0.9575    0.9572
    0.9058    0.0975    0.9649    0.4854
    0.1270    0.2785    0.1576    0.8003
    0.9134    0.5469    0.9706    0.1419

>> n = logical([1 0 1 1])

n =

  1×4 logical 数组

   1   0   1   1

>> m(:,n)

ans =

    0.8147    0.9575    0.9572
    0.9058    0.9649    0.4854
    0.1270    0.1576    0.8003
    0.9134    0.9706    0.1419

>> m(n,:)

ans =

    0.8147    0.6324    0.9575    0.9572
    0.1270    0.2785    0.1576    0.8003
    0.9134    0.5469    0.9706    0.1419
>> m(n)

ans =

    0.8147    0.1270    0.9134

>> m([n n])

ans =

    0.8147    0.1270    0.9134    0.6324    0.2785    0.5469

>> m([1 2 3; 4 5 6])
% 数值索引

ans =

    0.8147    0.9058    0.1270
    0.9134    0.6324    0.0975

>> m([n;n])
% 按列逻辑索引

ans =

    0.8147
    0.9058
    0.6324
    0.0975
    0.2785
    0.5469

当逻辑数组的尺寸大于被索引矩阵的尺寸,只要被索引的范围未超过被索引的矩阵的尺寸,仍然可以索引到。如果超出了,则会报错。

>> p = [m>0.5 false(4,1)]

p =

  4×5 logical 数组

   1   1   1   1   0
   1   0   1   0   0
   0   0   0   1   0
   1   1   1   0   0

>> m(p)

ans =

    0.8147
    0.9058
    0.9134
    0.6324
    0.5469
    0.9575
    0.9649
    0.9706
    0.9572
    0.8003

>> k = [m>0.5 true(4,1)]

k =

  4×5 logical 数组

   1   1   1   1   1
   1   0   1   0   1
   0   0   0   1   1
   1   1   1   0   1

>> m(k)
逻辑索引包含一个超出数组范围的 true 值。
>> C = rand(5)

C =

    0.6324    0.9649    0.8003    0.9595    0.6787
    0.0975    0.1576    0.1419    0.6557    0.7577
    0.2785    0.9706    0.4218    0.0357    0.7431
    0.5469    0.9572    0.9157    0.8491    0.3922
    0.9575    0.4854    0.7922    0.9340    0.6555

>> B = randi(10,4,1)

B =

     2
     8
     1
     3

>> C(B) = nan

C =

       NaN    0.9649    0.8003    0.9595    0.6787
       NaN    0.1576    0.1419    0.6557    0.7577
       NaN       NaN    0.4218    0.0357    0.7431
    0.5469    0.9572    0.9157    0.8491    0.3922
    0.9575    0.4854    0.7922    0.9340    0.6555

>> C([1;4;7]) = 0

C =

         0    0.9649    0.8003    0.9595    0.6787
       NaN         0    0.1419    0.6557    0.7577
       NaN       NaN    0.4218    0.0357    0.7431
         0    0.9572    0.9157    0.8491    0.3922
    0.9575    0.4854    0.7922    0.9340    0.6555

>> C([1 4 7]) = 0

C =

         0    0.9649    0.8003    0.9595    0.6787
       NaN         0    0.1419    0.6557    0.7577
       NaN       NaN    0.4218    0.0357    0.7431
         0    0.9572    0.9157    0.8491    0.3922
    0.9575    0.4854    0.7922    0.9340    0.6555
  • 通过逻辑索引填充矩阵
    以文件名自然排序的经典函数function [cs,index] = sort_nat(c,mode)为例,其中涉及很多逻辑索引。

自然排序的大致思想:

  1. 把文件名中连续的数字全部替换为0,以字符数组,比如A的形式展示,其中A的行为元胞数组中文件名的个数,A的列数为元胞数组中文件名字符最长的大小。
  2. 再构造一个数组比如B,把文件名中所有字符转化成ASCII码。对于原文件名中有数字的列,比如有n列有数字,就构造B的行和A一致,列为col(A)列数+2n。其中,这多出来的2n列应插入在A数组中0的后面,列的数值为原始文件名中连续数字的值,紧接着是这个数值的长度。
  3. B构造完毕后,将B通过sortrows函数按照所要求的升序或者降序排列。
% function [c_sort, index] = sort_c(c, mode)
% 
% if nargin < 2
%     mode = 'ascending';
% end
% 
% modetype = strcmp(mode, {'ascending', 'descending'});
% is_descending = modetype(2);
% 
% if ~any(mode)
%     error('the mode must be either ''ascending'' or ''descending''!');
% end


% c = {'a120', 'a129', '9ab87', 'bc110', 'a121'}
c = {'a120.txt', 'a129.txt', '9ab87.txt', 'bc110.txt', 'a121.txt'}
c0 = regexprep(c,'\d+','0')
s = char(c0)
s1 = s == '0'
[c1, startIndex, endIndex] = regexp(c,'\d+', "match")


len = length(c)
max_col = size(s1, 2)
%c_dig = NaN(size(s))
c_dig = NaN(len, max_col)
c_num = NaN(len, max_col)

for i = 1:len
    c_dig(i,s1(i,:)) = sscanf(sprintf('%s ', c1{i}{:}), '%f')
%把元胞数组c1中的数值提取出来依次格式化输入c_dig中
    c_num(i,s1(i,:)) = endIndex{i} - startIndex{i} + 1
    
end

used_col = find(~all(isnan(c_dig)))
col_num = sum(~all(isnan(c_dig)))

col_num1 = max_col + 2*col_num
dig_new = used_col + (1:2:2*col_num)
num_new = dig_new + 1

col = true(1, col_num1)
col(dig_new) = false
col(num_new) = false

dig = zeros(len, col_num1)
%依次填充dig中各列
dig(:,col) = double(s)
dig(:,dig_new) = c_dig(:,used_col)
dig(:,num_new) = c_num(:,used_col)

[x, index] = sortrows(dig)
%[~, index] = sortrows(dig)

% if is_descending
%     index = index(end:-1:1);
% end

c_sort = c(index)

每一步的输出情况如下:

c = 1×5 cell    
'a120.txt'    'a129.txt'    '9ab87.txt'    'bc110.txt'    'a121.txt'    

c0 = 1×5 cell    
'a0.txt'     'a0.txt'     '0ab0.txt'    'bc0.txt'    'a0.txt'     

s = 
    'a0.txt  '
    'a0.txt  '
    '0ab0.txt'
    'bc0.txt '
    'a0.txt  '

s1 = 5×8 logical 数组    
   0   1   0   0   0   0   0   0
   0   1   0   0   0   0   0   0
   1   0   0   1   0   0   0   0
   0   0   1   0   0   0   0   0
   0   1   0   0   0   0   0   0

c1 = 
    {1×1 cell}    {1×1 cell}    {1×2 cell}    {1×1 cell}    {1×1 cell}

startIndex = 
    {[2]}    {[2]}    {[1 4]}    {[3]}    {[2]}

endIndex = 
    {[4]}    {[4]}    {[1 5]}    {[5]}    {[4]}

len = 5
max_col = 8
c_dig = 5×8    
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_dig = 5×8    
   NaN   120   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_dig = 5×8    
   NaN   120   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   129   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_dig = 5×8    
   NaN   120   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   129   NaN   NaN   NaN   NaN   NaN   NaN
     9   NaN   NaN    87   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN     2   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_dig = 5×8    
   NaN   120   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   129   NaN   NaN   NaN   NaN   NaN   NaN
     9   NaN   NaN    87   NaN   NaN   NaN   NaN
   NaN   NaN   110   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN     2   NaN   NaN   NaN   NaN
   NaN   NaN     3   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

c_dig = 5×8    
   NaN   120   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   129   NaN   NaN   NaN   NaN   NaN   NaN
     9   NaN   NaN    87   NaN   NaN   NaN   NaN
   NaN   NaN   110   NaN   NaN   NaN   NaN   NaN
   NaN   121   NaN   NaN   NaN   NaN   NaN   NaN

c_num = 5×8    
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN
     1   NaN   NaN     2   NaN   NaN   NaN   NaN
   NaN   NaN     3   NaN   NaN   NaN   NaN   NaN
   NaN     3   NaN   NaN   NaN   NaN   NaN   NaN

used_col = 1×4    
     1     2     3     4

col_num = 4
col_num1 = 16
dig_new = 1×4    
     2     5     8    11

num_new = 1×4    
     3     6     9    12

col = 1×16 logical 数组    
   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

col = 1×16 logical 数组    
   1   0   1   1   0   1   1   0   1   1   0   1   1   1   1   1

col = 1×16 logical 数组    
   1   0   0   1   0   0   1   0   0   1   0   0   1   1   1   1

dig = 5×16    
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

dig = 5×16    
    97     0     0    48     0     0    46     0     0   116     0     0   120   116    32    32
    97     0     0    48     0     0    46     0     0   116     0     0   120   116    32    32
    48     0     0    97     0     0    98     0     0    48     0     0    46   116   120   116
    98     0     0    99     0     0    48     0     0    46     0     0   116   120   116    32
    97     0     0    48     0     0    46     0     0   116     0     0   120   116    32    32

dig = 5×16    
    97   NaN     0    48   120     0    46   NaN     0   116   NaN     0   120   116    32    32
    97   NaN     0    48   129     0    46   NaN     0   116   NaN     0   120   116    32    32
    48     9     0    97   NaN     0    98   NaN     0    48    87     0    46   116   120   116
    98   NaN     0    99   NaN     0    48   110     0    46   NaN     0   116   120   116    32
    97   NaN     0    48   121     0    46   NaN     0   116   NaN     0   120   116    32    32

dig = 5×16    
    97   NaN   NaN    48   120     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32
    97   NaN   NaN    48   129     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32
    48     9     1    97   NaN   NaN    98   NaN   NaN    48    87     2    46   116   120   116
    98   NaN   NaN    99   NaN   NaN    48   110     3    46   NaN   NaN   116   120   116    32
    97   NaN   NaN    48   121     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32

x = 5×16    
    48     9     1    97   NaN   NaN    98   NaN   NaN    48    87     2    46   116   120   116
    97   NaN   NaN    48   120     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32
    97   NaN   NaN    48   121     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32
    97   NaN   NaN    48   129     3    46   NaN   NaN   116   NaN   NaN   120   116    32    32
    98   NaN   NaN    99   NaN   NaN    48   110     3    46   NaN   NaN   116   120   116    32

index = 5×1    
     3
     1
     5
     2
     4

c_sort = 1×5 cell    
'9ab87.txt'    'a120.txt'    'a121.txt'    'a129.txt'    'bc110.txt'    

你可能感兴趣的:(程序员)