如何减少特定代码块的处理时间?

4
我制作了一个算法,需要执行大约100次。我想减少这段代码块的处理时间,有人能帮我减少它的处理时间或建议一个更高效的代码块吗?在我的笔记本电脑上,当它执行一次时,这个块需要大约“经过时间为29.213608秒”。如果我将这个经过时间乘以100,那么答案就是大约48.7分钟,这是一个很长的处理时间。如果有人能帮我这件事,我会非常感激;)
实际上,我想反转a的位,而a的类型是char,并且我无法通过应用not操作来反转位。然后我在某个地方学到,matlab中的not操作不适用于char类型,因此我首先将位从char转换为double,然后应用not操作,最后将结果矩阵从double转换回char类型。我的主要目的是反转char类型的位。如果有人能以另一种方式做到这一点,那么请帮助我。这件事需要很多处理时间:(
tic;
a(1:1000000,1)='0';

c=str2num(a);

c=~c;

d=num2str(c);

toc;
2个回答

2

你觉得这个怎么样 -

num2str((a-'0')==0)

或者使用ASCII等价物 -

char((a==48)+48) %// Thanks to Luis!

或者这个 -
char(97-a)

+1 我建议使用 char(((a-'0')==0)+'0')。更对称,而且可以去掉空格。 - Luis Mendo
1
或许 char((a=='0')+'0') 会更快。 - Luis Mendo
...并且改进了它!这一定是最快的。 - Luis Mendo
感谢Luis和@Divakar给我建议和帮助 :) 是的,Luis,这是在给定答案中最快的 :) char((a=='0'))+'0'); - user3801619
1
@Divakar 我检查了所有建议的代码并测试了它们,现在我的最终结论是,当矩阵中有少量值时,Luis的代码更快,而当矩阵中有大量值时,你的代码更快。再次感谢你们两个 :) - user3801619
显示剩余2条评论

2

你可以这样做:

b = repmat('0',size(a));
b(a=='0') = '1';

或者:

ind = a=='0';
a(ind) = '1';
a(~ind) = '0';

@Divakar 谢谢!已更正。 - Luis Mendo
@LuisMendo 你建议的代码是最快的 :) 而且,Divakar,你的两个代码也都能运行 :) 但是如果你比较一下这两个代码的经过时间,那么这个代码所需的时间比另一个少,但是当我将这个代码的处理时间与Luis Mendo的代码的处理时间进行比较时,Luis Mendo的代码更快..但还是要感谢你们两个 :) ind = a=='0'; a(ind) = '1'; a(~ind) = '0'; - user3801619
Divakar,你的代码时间是:已用时间为0.273470秒。 而LuisMendo,你的代码时间是:已用时间为0.190165秒。 但非常感谢你们两位给予我的帮助 :) 你们俩真是太好了 :) - user3801619

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接