如何在Julia中批量判断向量内矩阵的平方差和是否小于0?
批量判断向量中对应矩阵的平方差之和是否小于0的实现方法
问题背景
变量定义如下:
xs = [rand(2, 3) for _ in 1:2] ys = [rand(2, 3) for _ in 1:2]
需求是对每个索引i,判断sum((xs[i] .- ys[i]).^2) < 0,希望在一个if语句中完成批量判断,此前尝试if all(sum((xs .- ys).^2) < 0)出现报错,需正确实现方式。
错误原因
xs .- ys是对向量中对应矩阵做逐元素减法,得到的仍是由矩阵组成的向量。直接对该向量调用sum会把所有矩阵的元素全部累加得到一个标量,无法实现“每个矩阵单独计算平方差之和”的需求,因此报错。
正确实现方式
方式一:广播函数实现
利用Julia的广播机制,对每个矩阵单独计算平方差之和,再做比较:
if all(sum.((xs .- ys).^2) .< 0) # 此处编写条件满足时的执行逻辑 end
(xs .- ys).^2:对每个对应矩阵的元素做平方差运算sum.():对每个矩阵广播求和,得到每个矩阵的平方差之和组成的向量. < 0:对求和结果广播判断是否小于0,得到布尔值向量all():检查所有布尔值是否为真
方式二:生成器表达式实现
用zip配对对应矩阵,通过生成器表达式逐个计算条件,更节省内存:
if all(sum((x .- y).^2) < 0 for (x, y) in zip(xs, ys)) # 此处编写条件满足时的执行逻辑 end
zip(xs, ys):将xs和ys中的对应矩阵配对- 生成器表达式
sum((x .- y).^2) < 0 for (x, y) in zip(xs, ys):逐个计算每个矩阵对的判断条件 all():遍历生成器,判断所有条件是否都成立
内容的提问来源于stack exchange,提问作者js9
相关产品推荐
相关产品推荐

