我想在不使用 for 循环的情况下为 Matlab 中的对象列表分配一个值(为了提高效率)
基本上这有效:
for i=1:Nr_of_Objects
Objectlist(i,1).weight=0.2
end
Run Code Online (Sandbox Code Playgroud)
但我想要这样的东西:
Objectlist(:,1).weight=0.2
Run Code Online (Sandbox Code Playgroud)
哪个不起作用。我收到此错误:
预期花括号或点索引表达式有一个输出,但有 5 个结果。
将数组写入右侧也不起作用。我对 Matlab 中的面向对象编程不是很熟悉,所以如果有人能帮助我,我会很高兴。
您正在寻找的deal功能:
S(1,1).a = 1
S(2,1).a = 2
S(1,2).a = 3
[S(:,1).a] = deal(4)
Run Code Online (Sandbox Code Playgroud)
现在S(1,1).a和S(2,1).a等于4。
在 matlab 中,您可以使用 将多个输出连接到一个数组中[]。并将deal(X)单个输入复制到所有请求的输出。
所以在你的情况下:
[Objectlist(:,1).weight] = deal(0.2)
Run Code Online (Sandbox Code Playgroud)
应该管用。
注意到我不确定它会比 for 循环更快,因为我不知道该deal函数是如何实现的。
编辑:基准
n = 1000000;
[S(1:n,1).a] = deal(1);
tic
for ii=1:n
S(ii,1).a = 2;
end
toc
% Elapsed time is 3.481088 seconds
tic
[S(1:n,1).a] = deal(2);
toc
% Elapsed time is 0.472028 seconds
Run Code Online (Sandbox Code Playgroud)
或与 timeit
n = 1000000;
[S(1:n,1).a] = deal(1);
g = @() func1(S,n);
h = @() func2(S,n);
timeit(g)
% ans = 3.67
timeit(h)
% ans = 0.41
function func1(S,n)
for ii=1:n
S(ii,1).a = 2;
end
end
function func2(S,n)
[S(1:n,1).a] = deal(2);
end
Run Code Online (Sandbox Code Playgroud)
所以似乎使用该deal函数减少了计算时间。