Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在双单元阵列上执行右阵列除法_Arrays_Matlab_Cell - Fatal编程技术网

Arrays 如何在双单元阵列上执行右阵列除法

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循环来访问单元格数组的每个向量,然后应用

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

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
来减少键入。