如何在Matlab中以有效的方式为对象列表分配一个值?

Chi*_*ief 1 matlab

我想在不使用 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 中的面向对象编程不是很熟悉,所以如果有人能帮助我,我会很高兴。

obc*_*don 5

您正在寻找的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).aS(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函数减少了计算时间。