使用矩阵运算而不是 FOR 循环将单元格数组与索引值进行布尔比较



我有一个函数,它将一个向量作为输入,使用另一个函数从输入创建导数向量,然后比较两个向量以产生其输出向量。我目前让它使用 for 循环,如下所示:

原始数组nameVec用作以下函数的输入:

% INPUT: nameVec = ''  'a'  'b'  'aa'  'ab'  'ba'  'aba'  'abb'

首先,一个名为computeParentName的函数从nameVec的每个数组元素中删除最后一个字符并生成此单元格数组:

% OUTPUT: parentNameVec = ''  ''  ''  'a'  'a'  'b'  'ab'  'ab

接下来,函数computeParentIndex查找parentNameVec中每个元素出现在nameVec中的索引:

function [parentIndexVec] = computeParentIndex(nameVec)
parentNameVec = computeParentName(nameVec);
[~,parentIndexVec] = ismember(parentNameVec, nameVec);
end    
% OUTPUT: parentIndexVec = 1     1     1     2     2     3     5     5

我现在正在尝试开发一个本质上是反向作用的函数,因为它需要nameVec并输出一个单元格数组,该数组在每个索引处都包含一个parentNameVec中所有索引的数组,其中值是输出数组('daughterIndexVec')当前索引的值。

function [daughterIndexVec] = computeDaughterIndex(nameVec)
parentIndexVec = computeParentIndex(nameVec);
for i=1:length(parentIndexVec)
daughterIndexVec{i} = find(parentIndexVec==i); 
end
end
% OUTPUT: daughterIndexVec = {[1,2,3] [4,5] [6] [] [7,8] [] [] []}

有没有一种更简单(更有效)的方法可以在不使用for循环的情况下完成此操作?

任何帮助将不胜感激!

您可以使用ismember的第二个输出来获取每个值在nameVecparentNameVec的位置,然后使用accumarray将所有共享相同索引的索引分组到nameVec单元格数组中。

[~, ind] = ismember(parentNameVec, nameVec);
daughterIndexVec = accumarray(ind(:), 1:numel(ind), [numel(ind) 1], @(x){x.'});
%   {[1,2,3] [4,5] [6] [] [7,8] [] [] []}

最新更新