我有一个函数,它将一个向量作为输入,使用另一个函数从输入创建导数向量,然后比较两个向量以产生其输出向量。我目前让它使用 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
的第二个输出来获取每个值在nameVec
中parentNameVec
的位置,然后使用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] [] [] []}