快速选择分配0 nan

3视图(30天)
费德里科•nutarelli
费德里科•nutarelli 2022年12月17日
评论道: 沃尔特·罗伯森 2022年12月19日
你好,
有南ast的方式分配给零价值?从分析器我注意到这个操作正在超过第二个我的代码,希望它是最快的。
我有一些低效的代码(例如,事实上,有几个for循环,而唯一的一个)。这是我的代码,我想它快:
我= 1:N_RIPETIZIONI
j = 1:尺寸(colonna_i, 2)
% MATRICI_SIMULATE_nonan {i, j} = MATRICI_SIMULATE {i, j}。* A_nan;
MATRICI_SIMULATE_nonan {i, j} (MATRICI_SIMULATE_nonan {i, j} = = 0) =南;% %在这里
结束
结束
MATRICI_SIMULATE_DUMMY =细胞(N_RIPETIZIONI、大小(colonna_i 2));
我= 1:N_RIPETIZIONI
j = 1:尺寸(colonna_i, 2)
% MATRICI_SIMULATE_DUMMY {i, j} =双(MATRICI_SIMULATE_DUMMY {i, j});
MATRICI_SIMULATE_DUMMY {i, j} (A_nan = = 0) =南;% %在这里
结束
结束
这是在放缓speedd事实的结果我和细胞数组操作吗?我操作在不同的循环吗?
谢谢你!
3评论
马特·J
马特·J 2022年12月17日
我同意斯蒂芬。基于你已经告诉我们,目前尚不清楚为什么你的矩阵是分为细胞,当他们可以很容易地3 d数组。

登录置评。

答案(2)

沃尔特·罗伯森
沃尔特·罗伯森 2022年12月17日
询问 最快 做某事的方法是几乎总是一个错误。
假设 最快 方法的特定序列涉及确保每个单元格的内容是4 Kb物理边界对齐的内存中,并同时使用完全8核。所以你重写代码与一群墨西哥人调用以确保内存分配你所希望的方式(要求对齐的内存需要一个operating-system-specific叫但你需要使用MATLAB-supplied内存分配器的例程……)你测试出来,仅三个星期后的性能改进工作,你救了至少17个时钟周期计算。
然后你去运行代码在现实生活中……和你的系统去检查电子邮件和你失去的8核……和你的代码最终29日周期 比其他情况下。
然后你把代码交给别人,等等 他们的 系统,你精心调整 最快 代码总是低于替代品。因为得到 最快 代码你不得不利用各种指令的确切微码计时,等等 他们的 系统微码时间略有不同的细节和每个迭代周期丢失而不是获得一个循环。
会的 最快 可能版本的东西几乎都是净亏损(除非你是芯片制造商和获得最高的计算速度是非常重要的广告目的。)
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年12月19日
你需要的问题任何时候你使用最高级如“最快的”或“最”有效。你如何衡量效率呢?你如何处理这一事实做出更好的一个方面可能会使另一个方面更糟?

登录置评。


1月
1月 2022年12月17日
编辑:1月 2022年12月17日
避免计算 A_nan = = 0 在循环反复。这样做过一次循环:
C =细胞(119);
iC = 1:元素个数(C)
C {iC} =兰德(1229、222);
结束
一个=兰迪([0,1],1229,222);
抽搐;%原始版本:
A_nan = ~ = 0);
D =细胞(大小(C));
i1 = 1:10
i2 = 1:119
tmp = C {i1、i2};
tmp (A_nan = = 0) =南;
D {i1、i2} = tmp;
结束
结束
toc
运行时间是2.895987秒。
抽搐;%移动A_nan = = 0的循环:
A_nan = (A = = 0);% = = 0而不是~ = 0
D =细胞(大小(C));
i1 = 1:10
i2 = 1:119
tmp = C {i1、i2};
tmp (A_nan) =南;% A_nan代替A_nan = = 0
D {i1、i2} = tmp;
结束
结束
toc
运行时间是2.144534秒。
已经建议,掩蔽更快,如果你使用一个[10 x 119 x 1229 x 222]数组。

s manbetx 845


释放

R2020b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!