我试图解决这个问题:
给定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个单元格的单元格数组。
帮助?
答案 0 :(得分: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是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))