我有一个函数将一个矢量作为输入,使用另一个函数从输入创建一个导数矢量,然后比较两个矢量以产生其输出矢量。我现在有这一个工作循环如下:执行数组运算时不会循环涉及2个矢量的函数
function [parentIndexVec] = computeParentIndex(nameVec)
parentNameVec = computeParentName(nameVec);
for i=1:length(parentNameVec)
parentIndexVec(i) = find(strcmp(nameVec, parentNameVec{i}));
end
end
的computeParentName
功能基本返回nameVec
副本连同其删除最后一个字母。循环前的单元阵列然后显示如下:
nameVec = '' 'a' 'b' 'aa' 'ab' 'ba' 'aba' 'abb'
parentNameVec = '' '' '' 'a' 'a' 'b' 'ab' 'ab'
该功能的目标是找到的,其中在parentNameVec
每个元素出现在nameVec
的索引,并且它的输出因此为如下:
parentIndexVec = 1 1 1 2 2 3 5 5
我试图做一个cellfun
来实现这一点,但无法让它运作,因为两个向量必须在每个点进行比较。
我的问题如下:
- 有没有办法消除的循环来做到这一点?
- 在大多数情况下,矩阵运算而不是循环是否真的更快?
- 如果是这样,那么
cellfun
在速度上与纯矩阵运算进行比较,还是会像循环一样慢?
感谢您的协助!
我很欣赏这个回应。确切的我正在寻找的功能!所以,我实际上已经通过我的其他子函数来用'cellfun'替换'for'循环,所以我可能不知不觉地降低了它的效率。大多数使用'cellfun'完成的操作能以更快的矩阵操作方式完成吗?例如,上面提到的子函数('computeParentName')使用cellfun从'nameVec'单元格数组中删除每个元素的最后一个字母。有没有更简单的方法来做这样的事情? – teepee
@teepee它真的取决于您要执行的操作的具体细节。对于内置于MATLAB中的字符串的单元阵列进行操作有很多操作。要删除最后一个字符,我会这样做:'regexprep(nameVec,'。$','')'只是用空字符串替换最后一个字符。 – Suever
谢谢,我没有想过在MATLAB中使用正则表达式。非常好,他们可以处理chars和cellstr。这可以避免我写很多代码来处理这些区别。虽然我在这里,你会碰巧知道一个cellstr函数,它返回单元格数组中每个字符串的长度吗?即'lengthArray = foo({'aaa''bb''a'})'返回'[3 2 1]'? – teepee