【发布时间】:2013-10-03 00:15:20
【问题描述】:
例如,在这个简单/愚蠢的例子中:
n = 3;
x = zeros(n, 1);
for ix=1:4
x(ix) = ix;
end
数组是预先分配的,但在循环中动态调整大小。 Matlab 中是否有一个设置会在发生这样的动态调整大小时引发错误?在这个例子中,我可以简单地重写它:
n = 3;
x = zeros(n, 1);
for ix=1:4
if ix > n
error('Size:Dynamic', 'Dynamic resizing will occur.')
end
x(ix) = ix;
end
但我希望以此作为检查,以确保我已正确预分配矩阵。
【问题讨论】:
-
你为什么不循环
for ix=1:n?这样一来,如果您碰巧将n设置为错误的值,您只需修复一行代码。 -
澄清一下,涉及手动放置
assert语句或引发错误的变通办法,甚至封装该操作的函数都行不通。程序员可能有另一个变量y,其中动态调整大小是可以的,并且一直在检查y时性能损失是不好的。在这种情况下,程序员必须手动决定,对于每个潜在的动态调整大小操作和每个不同的数据变量,是使用基于断言/错误/函数的调用还是只使用基本的 Matlab 调用,从而导致复制/粘贴和不可读的代码。 -
@EMS 您抱怨其他人建议的丑陋解决方法,但这就是解决方法,丑陋。他们会很清楚,他们将是一个解决方案,而不是解决方法。我还没有从你那里听到真正的解决方案,你只是给了一个 python 的链接。不要因为这些丑陋的建议而责怪我们,责怪 Mathworks ...
-
我建议如果可行的话,真正使用 Python / NumPy 是最好的解决方案。这可能不是由于项目规模,这将是不幸的。在这种情况下,最好的解决方案是创建一个封装此索引检查逻辑的结构或类,然后忍受性能下降。解决方案不会是复制/粘贴或手动功能应用程序。这不仅仅是一种解决方法,它是一个无法回答的问题。如果您受到性能和项目规模的限制(因此切换到更适合的编程环境是不可行的) ) 那么问题就不容易解决
-
@EMS 不存在好的解决方案的答案(据我所知)也是一个有效的答案,即使这不是您所希望的。
标签: matlab