matlab dlnode,在matlab中预分配单元格数组

这更像是一个理解行为而不是特定问题的问题.

Mathworks指出数值是连续存储的,这使得预分配很重要.对于单元阵列不是这种情况.

它们是否与C中的向量或指针数组类似?

这意味着预先定位不是那么重要,因为指针的大小是double的一半(根据whos – 但肯定会在某处存储mxArray数据类型的开销).

运行此代码:

clear all

n = 1e6;

tic

A = [];

for i=1:n

A(end + 1) = 1;

end

fprintf('Numerical without preallocation %f s\n',toc)

clear A

tic

A = zeros(1,n);

for i=1:n

A(i) = 1;

end

fprintf('Numerical with preallocation %f s\n',toc)

clear A

tic

A = cell(0);

for i=1:n

A{end + 1} = 1;

end

fprintf('Cell without preallocation %f s\n',toc)

tic

A = cell(1,n);

for i=1:n

A{i} = 1;

end

fprintf('Cell with preallocation %f s\n',toc)

收益:

无预分配的数值0.429240 s

数值预分配0.025236 s

无预分配的电池4.960297 s

预分配的细胞为0.554257 s

数值并不奇怪.但是确实让我感到惊讶,因为只有指针的容器而不是数据本身才需要重新分配.哪个应该(因为指针小于双倍)导致<.2s magu_>

我尝试了Eitan T提出的链表,但我认为matlab的开销还很大.我尝试用双数组作为数据(rand(200000,1)).

我做了一个小小的情节来说明:

图表的代码:(我使用了matlab hompage中的dlnode类,如回答帖子中所述)

D =兰特(200000,1);

s = linspace(10,20000,50);

nC = zeros(50,1);

nL = zeros(50,1);

for i = 1:50

a = cell(0);

tic

for ii = 1:s(i)

a{end + 1} = D;

end

nC(i) = toc;

a = list([]);

tic

for ii = 1:s(i)

a.insertAfter(list(D));

end

nL(i) = toc;

end

figure

plot(s,nC,'r',s,nL,'g')

xlabel('#iter')

ylabel('time (s)')

legend({'cell' 'list'})

不要误会我的意思我喜欢链表的想法,因为它有相当的灵活性,但我认为开销可能很大.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值