在MATLAB单元索引数组中反向查找

时间:2013-02-18 11:04:45

标签: matlab cell-array

我试图解决这个问题:

给定n个元素数组的索引向量的5x1单元格数组,我需要找到反向映射。

我所拥有的是“在第2组中,有元素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个单元格的单元格数组。

帮助?

2 个答案:

答案 0 :(得分:5)

您可以cellfunarrayfun的组合执行此操作。首先创建一个单元格数组:

>> 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的第1和第4个元素。现在,您可以使用arrayfun将其映射到所有可能索引的列表上。生成的数组可能长度不同,因此我们需要将'UniformOutput'设置为false

>> n = 5;
>> result = arrayfun(@(i)find(cellfun(@(s)ismember(i,s), mycellarray)), 1:n, ...
                     'UniformOutput', false);

元素是您想要的索引向量 -

>> result{1}
ans =
     1     4    # since 1 is in the 1st and 4th array
>> result{3}
ans =
     3     4    # since 3 is in the 3rd and 4th array

答案 1 :(得分:4)

您是否必须使用单元阵列来节省空间?

否则,您可以将当前矩阵更改为MxN法线矩阵,其中N是已定义的n,M是组数。然后用零填充每行的末尾。因此它保存相同的信息,但它使您可以使用find轻松进行反向查询。

所以如果n = [1 2 3 4 5 6 7]

我们有3个组,其中第1组为[1 4 5],第2组为[3],第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(any(m == i, 2))