如何在两个单元阵列上进行右阵分割

时间:2015-02-14 17:17:20

标签: arrays matlab cell

我有两个单元格数组: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为您提供帮助

2 个答案:

答案 0 :(得分:5)

使用cellfun结合maxmin来实现您的目标:

C = cellfun(@(x,y)sqrt(max(x,y)./min(x,y)), A, B, 'uniformOutput',false)

cellfun将一个函数应用于单元格的每个元素(三个长度分别为16,37和43的数组)。 'UniformOutput', false表示应在具有与输入相同数量的元素的单元数组中返回输出。

@(x,y)表示一个匿名函数,它接受两个输入参数(来自AB的相应数组)。

max(x,y)获取数组xy的相应元素的最大值,从而保证在除法的分子中始终具有最大值。

答案 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)