如何对两个元胞数组进行右数组除法

How to perform right-array division on two cell array

我有两个元胞数组:A={<16x1 double>, <37x1 double>, <43x1 double>} 和 B={<16x1 double>, <37x1 double>, <43x1 double>}。现在,我想将元胞数组 A 的每个元素除以元胞数组 B 的相应元素,反之亦然!如果元胞数组 B 的元素大于元胞数组 A 的元素,则除法应为 B./A,然后计算这些值的平方根。对于两个矩阵,我知道我可以简单地编写以下代码:

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

但我不知道如何为元胞数组扩展这个算法?我知道我可以定义两个 for 循环来访问元胞数组的每个向量然后应用我上面的代码但是这个算法太慢而且它对大元胞数组没有真正的帮助因为我已经写了我提到的代码并且我看到它真的很糟糕! 感谢您的帮助

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

一种方法是在这些元胞数组中使用 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)