如何在Matlab中高效地为对象列表指定一个值?
我想在Matlab中为对象列表指定一个值,而不使用for循环(以提高效率) 基本上这是可行的:如何在Matlab中高效地为对象列表指定一个值?,matlab,Matlab,我想在Matlab中为对象列表指定一个值,而不使用for循环(以提高效率) 基本上这是可行的: for i=1:Nr_of_Objects Objectlist(i,1).weight=0.2 end 但我想要这样的东西: Objectlist(:,1).weight=0.2 这是行不通的。我得到这个错误: 期望大括号或点索引表达式有一个输出,但有5个结果。 将数组写入右侧也不起作用。 我不太熟悉Matlab中的面向对象编程,所以如果有人能帮助我,我会很高兴 您正在寻找的功能: S(
for i=1:Nr_of_Objects
Objectlist(i,1).weight=0.2
end
但我想要这样的东西:
Objectlist(:,1).weight=0.2
这是行不通的。我得到这个错误:
期望大括号或点索引表达式有一个输出,但有5个结果。
将数组写入右侧也不起作用。
我不太熟悉Matlab中的面向对象编程,所以如果有人能帮助我,我会很高兴 您正在寻找的功能:
S(1,1).a = 1
S(2,1).a = 2
S(1,2).a = 3
[S(:,1).a] = deal(4)
现在S(1,1).a
和S(2,1).a
等于4
在matlab中,您可以使用[]
将多个输出串联在一个数组中。和deal(X)
将单个输入复制到所有请求的输出
因此,在你的情况下:
[Objectlist(:,1).weight] = deal(0.2)
应该有用
注意,我不确定它是否会比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
或者使用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
因此,似乎使用deal
函数可以减少计算时间 您正在寻找的功能:
S(1,1).a = 1
S(2,1).a = 2
S(1,2).a = 3
[S(:,1).a] = deal(4)
现在S(1,1).a
和S(2,1).a
等于4
在matlab中,您可以使用[]
将多个输出串联在一个数组中。和deal(X)
将单个输入复制到所有请求的输出
因此,在你的情况下:
[Objectlist(:,1).weight] = deal(0.2)
应该有用
注意,我不确定它是否会比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
或者使用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
因此,似乎使用
deal
函数可以减少计算时间 根据我的经验,tic/toc并不总是可靠的,试着改变基准顺序(第一个是deal,第二个是loop),看看结果是否一致。不过,还有函数和“使用分析运行”选项。@Mefitico如果内存已预分配,则顺序不应更改计算时间。我添加了timeit版本。谢谢,这真的帮了我的忙。尽管我的代码使用for循环比使用deal函数更快。我现在不知道,也许这取决于我使用的matlab版本(R2018b)。我使用在线“实时编辑器”作为基准。如果你的结构中只有一列,你也可能对a感兴趣。我认为deal
减少执行时间是有意义的:它在一个操作中分配所有的值;每次更改对象数组的一个值时,循环都必须复制对象数组的“header”内容,即使它不必复制字段中保存的任何底层基本数据。我猜这样做可以避免中间对象数组状态及其关联GC的所有临时副本。根据我的经验,tic/toc并不总是可靠的,请尝试更改基准顺序(第一次使用deal,第二次使用loop),看看结果是否一致。不过,还有函数和“使用分析运行”选项。@Mefitico如果内存已预分配,则顺序不应更改计算时间。我添加了timeit版本。谢谢,这真的帮了我的忙。尽管我的代码使用for循环比使用deal函数更快。我现在不知道,也许这取决于我使用的matlab版本(R2018b)。我使用在线“实时编辑器”作为基准。如果你的结构中只有一列,你也可能对a感兴趣。我认为deal
减少执行时间是有意义的:它在一个操作中分配所有的值;每次更改对象数组的一个值时,循环都必须复制对象数组的“header”内容,即使它不必复制字段中保存的任何底层基本数据。我猜这样做可以避免中间对象数组状态及其关联GC的所有临时副本。