我有两个单元格数组:A = {< 16x1 double>,< 37x1 double>,< 43x1 double>}和B = {< 16x1 double>,< 37x1 double>,< 43x1双>}。现在,我想用单元格数组B的相应元素划分单元格数组A的每个元素,反之亦然!如果单元阵列B的元素大于单元阵列A的元素,则该偏差应为B./A,然后计算这些值的平方根。对于Two矩阵,我知道我可以简单地编写以下代码:
if(a > b )
ratio= sqrt(a ./ b);
else
ratio= sqrt(b ./ a);
end
但我不知道如何扩展此算法的单元格数组?我知道我可以定义两个for循环来访问单元格数组的每个向量,然后应用我的上面的代码,但是这个算法太慢了,因为我编写了像我提到的代码,所以它对大单元格数组没有用。看到它真的糟透了! THX为您提供帮助
答案 0 :(得分:5)
使用cellfun
结合max
和min
来实现您的目标:
C = cellfun(@(x,y)sqrt(max(x,y)./min(x,y)), A, B, 'uniformOutput',false)
cellfun
将一个函数应用于单元格的每个元素(三个长度分别为16,37和43的数组)。 'UniformOutput', false
表示应在具有与输入相同数量的元素的单元数组中返回输出。
@(x,y)
表示一个匿名函数,它接受两个输入参数(来自A
和B
的相应数组)。
max(x,y)
获取数组x
和y
的相应元素的最大值,从而保证在除法的分子中始终具有最大值。
答案 1 :(得分:0)
一种方法可能是在这些单元格数组中使用logical indexing
-
%// Store ratios as a separate cell array
A_B = cellfun(@(x,y) sqrt(x./y),A,B,'Uni',0)
%// Create cell array of logical arrays storing the conditional
C = cellfun(@(x,y) x>y,A,B,'Uni',0)
%// Use those conditionals to choose between the ratios or their reciprocals
out = cellfun(@(c,ab) c.*ab + ~c./ab,C,A_B,'Uni',0)
您可以使用上述方法制作单线程,但这样做只需要额外的sqrt
次操作 -
out = cellfun(@(x,y) (x>y).*sqrt(x./y) + (x<=y).*sqrt(y./x),A,B,'Uni',0)