MATLAB单元索引数组的反向查找

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

为了解决这个问题,我遇到了困难:

给定一个索引向量的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    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))