Arrays 如何在双单元阵列上执行右阵列除法
我有两个单元格数组,如:A={,}和B={,}。现在,我想用单元格数组A的每个元素除以单元格数组B的相应元素,反之亦然!如果单元阵列B的元素大于单元阵列A的元素,则除法应为B./A,然后计算这些值的平方根。对于两个矩阵,我知道我可以简单地编写以下代码:Arrays 如何在双单元阵列上执行右阵列除法,arrays,matlab,cell,Arrays,Matlab,Cell,我有两个单元格数组,如:A={,}和B={,}。现在,我想用单元格数组A的每个元素除以单元格数组B的相应元素,反之亦然!如果单元阵列B的元素大于单元阵列A的元素,则除法应为B./A,然后计算这些值的平方根。对于两个矩阵,我知道我可以简单地编写以下代码: if(a > b ) ratio= sqrt(a ./ b); else ratio= sqrt(b ./ a); end 但我不知道如何将此算法扩展到单元阵列?我知道我可以定义两个for循环来访问单元格数组的每个向量,然后应用
if(a > b )
ratio= sqrt(a ./ b);
else
ratio= sqrt(b ./ a);
end
但我不知道如何将此算法扩展到单元阵列?我知道我可以定义两个for循环来访问单元格数组的每个向量,然后应用我上面的代码,但是这个算法太慢了,对大型单元格数组没有什么帮助,因为我写了一个我提到的代码,我发现它真的很糟糕!!
THX为您提供帮助使用
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
的对应元素的最大值,从而保证除法的分子中始终有最大值 结合使用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
的对应元素的最大值,从而保证除法的分子中始终有最大值 一种方法是在这些单元数组中使用逻辑索引
-
%// 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)
out=cellfun(@(x,y)(x>y)。*sqrt(x./y)+(x一种方法可以是在这些单元数组中使用逻辑索引
-
%// 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)
out=cellfun(@(x,y)(x>y)。*sqrt(x./y)+(x实际上你的代码对矩阵不起作用。if语句的计算结果是all(a>b)
。这是你想要的还是一个错误?实际上你的代码对矩阵不起作用。if语句的计算结果是all(a>b)
。这是您想要的还是一个错误?您可以使用cellfun
而不是arrayfun
来减少键入。您可以使用cellfun
而不是arrayfun
来减少键入。