如何对两个单元的数组进行正确的数组划分



我有两个类似的单元阵列:A={<16x1 double>,<37x1 double><43x1 double>>}和B={lt;16x1 duble>,lt;37x1 duble>>43x1double>}。现在,我想把单元阵列A的每个元素除以单元阵列B的相应元素,反之亦然!如果单元阵列B的元素大于单元阵列A的元素,则偏差应为B/A,然后计算这些值的平方根。对于Two矩阵,我知道我可以简单地写下面的代码:

if(a > b )
 ratio= sqrt(a ./ b);
else
 ratio= sqrt(b ./ a);   
end

但我不知道如何将这种算法扩展到单元阵列?我知道我可以定义两个for循环来访问单元阵列的每个向量,然后应用上面的代码,但这个算法太慢了,对大型单元阵列没有真正的帮助,因为我已经写了一个我提到的代码,我发现它真的很糟糕!!THX感谢您的帮助

cellfunmaxmin结合使用以实现您想要的:

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的相应元素的最大值,从而保证除法的分子总是最大值。

一种方法可以是在这些单元阵列中使用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)

最新更新