gpt4 book ai didi

matlab - 我可以阻止 Matlab 动态调整预分配数组的大小吗?

转载 作者:太空宇宙 更新时间:2023-11-03 19:18:49 24 4
gpt4 key购买 nike

例如,在这个简单/愚蠢的例子中:

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

但我希望将其用作检查以确保我已正确预分配我的矩阵。

最佳答案

您可以创建double 的子类并在subsasgn 方法中限制赋值:

classdef dbl < double
methods
function obj = dbl(d)
obj = obj@double(d);
end

function obj = subsasgn(obj,s,val)
if strcmp(s.type, '()')
mx = cellfun(@max, s.subs).*~strcmp(s.subs, ':');
sz = size(obj);
nx = numel(mx);
if nx < numel(sz)
sz = [sz(1:nx-1) prod(sz(nx:end))];
end
assert(all( mx <= sz), ...
'Index exceeds matrix dimensions.');
end
obj = subsasgn@double(obj, s, val);
end

end
end

所以现在当你预分配时使用dbl

>> z = dbl(zeros(3))
z =
dbl

double data:
0 0 0
0 0 0
0 0 0
Methods, Superclasses

double 的所有方法现在都由 dbl 继承,您可以像往常一样使用它,直到您将某些东西分配给 z

>> z(1:2,2:3) = 6
z =
dbl

double data:
0 6 6
0 6 6
0 0 0
Methods, Superclasses

>> z(1:2,2:5) = 6
Error using dbl/subsasgn (line 9)
Index exceeds matrix dimensions.

我还没有对它进行基准测试,但我预计这对性能影响不大。

如果您希望值的显示看起来正常,您也可以重载 display 方法:

function display(obj)
display(double(obj));
end

然后

>> z = dbl(zeros(3))
ans =
0 0 0
0 0 0
0 0 0
>> z(1:2,2:3) = 6
ans =
0 6 6
0 6 6
0 0 0
>> z(1:2,2:5) = 6
Error using dbl/subsasgn (line 9)
Index exceeds matrix dimensions.
>> class(z)
ans =
dbl

关于matlab - 我可以阻止 Matlab 动态调整预分配数组的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com