MATLAB单元索引数组的反向查找
为了解决这个问题,我遇到了困难: 给定一个索引向量的5x1单元数组到一个n元素数组,我需要找到反向映射 我的关系是“在第二组中,有15,16,17,…。” 我想要的是“元素15是组2,4,5的成员。” 这是我的细胞阵列的结构MATLAB单元索引数组的反向查找,matlab,cell-array,Matlab,Cell Array,为了解决这个问题,我遇到了困难: 给定一个索引向量的5x1单元数组到一个n元素数组,我需要找到反向映射 我的关系是“在第二组中,有15,16,17,…。” 我想要的是“元素15是组2,4,5的成员。” 这是我的细胞阵列的结构 myCellArray = [1x228 double] [1x79 double] [1x136 double] [1x93 double] [1x81 double] 这是我的索引向量内容的一部分 myCellArray{2}(1:5) = 15
myCellArray =
[1x228 double]
[1x79 double]
[1x136 double]
[1x93 double]
[1x81 double]
这是我的索引向量内容的一部分
myCellArray{2}(1:5) =
15 16 17 18 19
我想要的是一个由n个单元组成的单元数组,其中包含每个元素的组成员索引
帮助?您可以结合使用
cellfun
和arrayfun
来实现这一点。首先创建一个单元格数组:
>> mycellarray = { [1 2], [4 5], [3 4], [1 2 3 4 5] };
要获取包含特定数字(例如1)的单元格数组元素,可以使用cellfun
:
>> find( cellfun(@(s)ismember(1, s), mycellarray) )
ans =
1 4
它告诉你1在mycellarray的第一和第四元素中。现在,您可以使用arrayfun
将其映射到所有可能索引的列表上。生成的数组可能具有不同的长度,因此我们需要将'UniformOutput'
设置为false
>> n = 5;
>> result = arrayfun(@(i)find(cellfun(@(s)ismember(i,s), mycellarray)), 1:n, ...
'UniformOutput', false);
元素是您想要的索引向量--
是否必须使用单元阵列来节省空间 否则,您可以将当前矩阵更改为MxN法线矩阵,其中N是您定义的N,M是组数。然后用零填充每行的末尾。因此,它保存相同的信息,但使用
find
可以轻松进行反向查询
所以如果n=[1234567]
我们有三组,第一组是[1 4 5]
,第二组是[3]
,第三组是[1 2 6 7]
,您当前的矩阵是
M = 3; N = numel(n);
m = zeros(M,N);
m(1, 1:3) = [1 4 5];
m(2, 1) = 3;
m(3, 1:4) = [1 2 6 7];
现在您想知道编号i
属于哪个组。简单到(根据Chris Taylor的观察更新)
这不太管用。例如,
find(m==2)
返回6
。要获得包含i
的组,我认为您需要编写find(any(m==i,2))
。很好,我没有测试只有一个结果的情况。现在将进行编辑。
M = 3; N = numel(n);
m = zeros(M,N);
m(1, 1:3) = [1 4 5];
m(2, 1) = 3;
m(3, 1:4) = [1 2 6 7];
find(any(m == i, 2))