4

我试图解决这个问题时遇到了一堵砖墙:

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

我所拥有的是“在第 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 个单元格的单元格数组,其中包含每个元素的组成员资格索引。

帮助?

4

2 回答 2

5

您可以使用 和 的组合来执行此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 在 的第 1 个和第 4 个元素中mycellarray。现在您可以使用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
于 2013-02-18T11:17:10.257 回答
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];

now you want to know which group does the number i belong to. It's as simple as (updated based on Chris Taylor's observation)

find(any(m == i, 2))
于 2013-02-18T11:21:03.457 回答