Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Matlab中高效地为对象列表指定一个值?_Matlab - Fatal编程技术网

如何在Matlab中高效地为对象列表指定一个值?

如何在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(

我想在Matlab中为对象列表指定一个值,而不使用for循环(以提高效率)

基本上这是可行的:

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的所有临时副本。