matlab自带的线性索引转换下标函数必须指定下标个数,也就是数据的维度。这在实际应用中受到了限制。
(什么是线性索引,什么是下标,不再介绍,相信你如果搜到了本贴,必然知道这两个概念)
% 原函数:
% 原函数可以直接拷贝到matlab中,生成m函数使用。
% 重写一个由线性索引查找下标的函数,适合多维,输出数组代表下标
% matlab 自带输出结果必须指定下标个数,此处无需指定
function subarray = myind2sub(datasize, ind)
% input: datasize 数据尺寸
% ind 数据线性索引 整数
% output: subarray 数组形式的下标索引
% suozi 2016.05.17 HIT
% 379786867 buaasuozi@126.com
% ind 判断
if ind ~= fix(ind)
disp('输入的索引必须为整数')
return
end
subarray = zeros(size(datasize));
rest = ind;
i=length(datasize);
while i > 0
if i ~= 1
tmpdivide = rest/prod(datasize(1:i-1));
if tmpdivide == fix(tmpdivide) % 余数为0
subarray(i) = tmpdivide;
else
subarray(i) = floor(tmpdivide) + 1;
end
tmprest = rest - (subarray(i) - 1)*prod(datasize(1:i-1));
if tmprest ~= 0
rest = tmprest;
% else rest = rest;
end
else
subarray(i) = rest;
end
i = i - 1;
end
end
如果函数有漏洞或错误,请指正。
示例:
example1:
>> A = rand(5,5)
A =
0.8147 0.0975 0.1576 0.1419 0.6557
0.9058 0.2785 0.9706 0.4218 0.0357
0.1270 0.5469 0.9572 0.9157 0.8491
0.9134 0.9575 0.4854 0.7922 0.9340
0.6324 0.9649 0.8003 0.9595 0.6787
>> subarray = myind2sub(size(A), 10)
subarray =
5 2
example2:
>> A = rand(3,4,2)
A(:,:,1) =
0.7577 0.6555 0.0318 0.0971
0.7431 0.1712 0.2769 0.8235
0.3922 0.7060 0.0462 0.6948
A(:,:,2) =
0.3171 0.4387 0.7952 0.4456
0.9502 0.3816 0.1869 0.6463
0.0344 0.7655 0.4898 0.7094
>> subarray = myind2sub(size(A), 10)
subarray =
1 4 1
>>