matlab: []*[] == [] 使矢量化代码变得困难

计算科学 matlab
2021-12-03 18:43:33

在我(诚然简短的)经验中,曾有过代码因为 []*[] == [] 而变得更丑的情况,如果将其定义为 0,则可以编写更优雅的代码。

对于这样一段代码的示例,这部分应该计算 L*x=b 中的 x(L 是下三角矩阵):

x(1) = b(1)/A(1,1);
for i=2:n
   x(i) = (b(i) - A(i,1:i-1)*x(1:i-1))/A(i,i);
end

问题是我必须通过两个不同的案例来实现。我不认为我沉迷于代码美,但这对我来说并不愉快。

我的问题是:有没有办法在单个 for 循环中完成这项工作(不使用 isempty)?另外,我很想知道开发人员做出的这个特殊选择是否有我不知道的原因。

谢谢你。

1个回答

一种选择是x = zeros(n,1)在开始循环之前进行初始化,然后应该从1n在这种情况下,第一次通过循环评估该术语A(1,1:0)*x(1:0)意味着将1x0矩阵乘以0x1MATLAB 评估为0

这依赖于(在我看来)一种非常不直观的行为,我不确定“美丽”的感知好处是否值得增加正在发生的事情的不透明度。我会将其归档在“以后可能会咬你的”“优化”下。另一方面,您可能x无论如何都应该进行初始化,因此 MATLAB 不必继续增长数组。

以下代码应按预期工作:

x = zeros(n,1);
for i=1:n
    x(i) = (b(i) - L(i,1:i-1)*x(1:i-1))/L(i,i);
end

编辑:
再考虑一下。这种行为可能会转化为 MATLAB 中的许多类似情况,这可能是设计人员选择使矩阵乘法对任何符合矩阵的有效操作的原因,即使某些数组维度为零。通过将矩阵乘法的结果定义为一个适当大小的零数组,当内部维度都为零时,即使程序员没有考虑这种极端情况的细节,代码也可能会按预期工作。

我仍然不确定这是一件值得依赖的好事情。它可能会让人们感到困惑,如果移植到其他语言,它几乎肯定会失败。