matlab 程序运行很慢,怎么改进?

figure
hold on;grid on
for i=1:100;
E=10;
Theta0=0;
m0=rand;
m1=rand; %%确定随机数
x=[];
y=[];
z=[];
x(1)=0.05.*(-log(m0)).^0.5*cos(2*pi*m1);
y(1)=0.05.*(-log(m0)).^0.5*sin(2*pi*m1);
z(1)=0; %%散射起点坐标
n=1;
P0=[1,0,0;0,1,0;0,0,1];
while E>=0.1&z(n)>=0
m2=rand;
m3=rand;
m4=rand;
m5=rand;
m6=rand;
if z(n)<=0.5
if m2<0.58
A=12;Z=6;
elseif m2>=0.58&m2<0.63
A=1;Z=1;
else
A=16;Z=8;
end
else
A=28;Z=14;
end
sign=(m3-0.5)/abs(m3-0.5);
theta0=0.0034.*Z.^(0.67)/(1.0*E);
t=1-2*theta0*m4/(1.0+theta0-m4);
Theta=2*acos(t); %%计算散射角
fai=2*pi.*m6;
s=-A.*log(m5)/(60*1.24*3.*Z.^1.7)*(E+0.005.*Z.^1.7*E.^0.5+0.0007*Z*Z/E.^0.5);
e=7.85*1.24*Z.*log(1.166*(E+0.0496)/0.0656)/(1.0*A*E); %%计算散射自由程和能量损失
Q=[-sin(fai),-cos(Theta)*cos(fai),sin(Theta)*cos(fai);cos(fai),-cos(Theta)*sin(fai),sin(Theta)*sin(fai);0,sin(Theta),cos(Theta)];
Deter=[sin(Theta)*cos(fai);sin(Theta)*sin(fai);cos(Theta)];
P0=P0*Q;
M=P0*Deter;
n=n+1;
x(n)=x(n-1)+s*M(1);
y(n)=y(n-1)+s*M(2);
z(n)=z(n-1)+s*M(3);
E=E-e*s;
scatter3(x,y,z,2,z);
view(45,45)
end
i=i+1;
end
谢谢大神们,帮忙改进一下,运行的是实在太慢了

提高matlab程序运行速度,可以用以下方法:

1、更改MATLAB启动快捷方式

在缺省配置下,MATLAB有一个启动闪屏,去掉它可以节省一定的内存消耗,从而加快启动。

在MATIJAB启动快捷方式后添加命令行参数 一nos-plash”即可_去掉闪屏。

缺省配置 MATLAB会启动虚拟机,这会消耗大量内存。添加命令行参数"-nojvm”可禁用JAVA虚拟机。

MATLAB启动快捷方式命令形如:

"%MATLABROOT%\bin\win32\matlab.exe -nosplash -nojvm”。

经过以上配置,MATLAB启动和运行速度会得到大幅提升。

注意:禁用JAVA虚拟机后,MATLAB中有些功能,诸如:调试功能、可视化界面设计功能不能使用,但大多数其它功能可正常运行。如果使用的功能需要JAVA虚拟机支持,启动时将命令行参数 一nojvm 去掉即可。

2、更改MATLAB搜索路径

MATLAB启动时会添加搜索路径。如果安装了多个工具箱,搜索路径会很多。过多的搜索路径除了减缓启动速度外,还会影响MATLAB执行效率。因为MATLB执行程序时会在这些路径中寻找M文件。而实际上我们不会为完成某个任务使用所有的工具箱。为提高启动和运行速度,可以修改pathdef.m文件,将暂时不用的工具箱和其它搜索路径注释掉(MATLAB程序以%为注释标识),从而加快启动和运行。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-11

clear all;clc;
load breastone.mat
[M N]=size(I);
m=23;n=20;
con_l=0.1;
CT=(0:255);
hist_T=zeros(1,256);
for k=1:256
    for i=1:M-m+1
        for j=1:N-n+1
           nb=I(i:i+m-1,j:j+n-1);
           Max_n=max(max(nb));
           Min_n=min(min(nb));
           if (((Max_n<CT(k)*(1+con_l))&(Max_n>CT(k)*(1-con_l)))&((Min_n<CT(k)*(1+con_l))&(Min_n>CT(k)*(1-con_l))))
               fflag=1;
               if(fflag==1)
                   hist_T(k)=hist_T(k)+1;
               end
           end
        end
    end
end

确定灰度值是如何取值的,所以我用一个窗口(即,一个像素的邻域)扫描整个图像,并计算每个像素的邻域内的最大值与最小值,判断Max与Min是否满足条件,是就判定为所定义的概念,然后累计一个值。

第2个回答  推荐于2017-09-14
我试了一下,你这个问题主要出在这儿。
scatter3(x,y,z,2,z);
view(45,45)
我不知道你为什么要每循环一次while(不是外层for i=1:100)就画一个图,当然可能是你题目的需要。但是这样每一次只画了一个点,然而时间几乎都是花在画图上了。如果,当while循环完了之后再画图,这样相当于只画了100次。时间大大降低,在2秒左右。
你原来的程序,时间主要都花在画图上!本回答被提问者和网友采纳
第3个回答  2015-08-19
matlab 程序运行很慢,是属于编程性问题,需要通过以下程序来解决。
clear all;clc;
% load breastone.mat

I = imread('cameraman.tif');
[M N] = size(I);
m = 23;n = 20;
con_l = 0.1;
CT = (0:255);
hist_T = zeros(1,256);
for i = 1:M - m + 1
for j = 1:N - n + 1
nb = I(i:i + m - 1,j:j + n - 1);
Max_n = max(nb(:));
Min_n = min(nb(:));
ind = find(((Max_n < CT*(1 + con_l)) & (Max_n > CT*(1 - con_l)))...
& ((Min_n < CT*(1 + con_l)) & (Min_n > CT*(1 - con_l))));
hist_T(ind) = hist_T(ind) + 1;
end
end
第4个回答  2015-08-27
代码如下:
clear all;clc;
load breastone.mat
[M N]=size(I);
m=23;n=20;
con_l=0.1;
CT=(0:255);
hist_T=zeros(1,256);
for k=1:256
for i=1:M-m+1
for j=1:N-n+1
nb=I(i:i+m-1,j:j+n-1);
Max_n=max(max(nb));
Min_n=min(min(nb));
if (((Max_n<CT(k)*(1+con_l))&(Max_n>CT(k)*(1-con_l)))&((Min_n<CT(k)*(1+con_l))&(Min_n>CT(k)*(1-con_l))))
fflag=1;
if(fflag==1)
hist_T(k)=hist_T(k)+1;
end
end
end
end
end