-
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 值。
- 通过逻辑索引填充矩阵
以文件名天然排序的经典函数 function [cs,index] = sort_nat(c,mode)为例,其中波及很多逻辑索引。
天然排序的大抵思维:
- 把文件名中间断的数字全副替换为 0,以字符数组,比方 A 的模式展现,其中 A 的行为元胞数组中文件名的个数,A 的列数为元胞数组中文件名字符最长的大小。
- 再结构一个数组比方 B,把文件名中所有字符转化成 ASCII 码。对于原文件名中有数字的列,比方有 n 列有数字,就结构 B 的行和 A 统一,列为 col(A)列数 +2n。其中,这多进去的 2n 列应插入在 A 数组中 0 的前面,列的数值为原始文件名中间断数字的值,紧接着是这个数值的长度。
- 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'