
matlab的问题:对一段求相似度函数的程序进行优化
我编了一段求相似度函数的程序,结果老是运行不出来,把那个矩阵变小后就可以运行出结果来,但是我要用的矩阵都很大,哪位高手可以帮我把我的程序优化下啊load('D:\MATL...
我编了一段求相似度函数的程序,结果老是运行不出来,把那个矩阵变小后就可以运行出结果来,但是我要用的矩阵都很大,哪位高手可以帮我把我的程序优化下啊
load('D:\MATLAB7\work\J1.mat'); load('D:\MATLAB7\work\J2.mat');
J1=double(J1);J2=double(J2);
[Height,Width]=size(J1);
J1p=zeros([Height Width]); %300*300
J2p=zeros([Height Width]);
C11=zeros([Height Width]);
C12=zeros([Height Width]);
C13=zeros([Height Width]);
C1=zeros([Height Width]);
maxC1=zeros([Height Width]);
maxC1x=zeros([1 Width]);
maxC1y=zeros([1 Width]);
for i1=2:Height-1
for j1=2:Width-1
if J1(i1,j1)==0
maxC1(i1,j1)=0;
else
J1n=J1(i1-1:i1+1,j1-1:j1+1);
J1np=mean(J1n(:));
J1n=abs(J1n-J1np);
C12(i1,j1)=sum(J1n(:).^2);
for i2=2:Height-1
for j2=2:Width-1
if J2(i2,j2)==0
C1(i2,j2)=0;
else
J2n=J2(i2-1:i2+1,j2-1:j2+1);
J2np=mean(J2n(:));
J2n=abs(J2n-J2np);
C13(i2,j2)=sum(J2n(:).^2);
C11(i2,j2)=sum(sum(J1n.*J2n));
C1(i2,j2)=C11(i2,j2)./(sqrt(C12(i1,j1)).*sqrt(C13(i2,j2)));
end
if C1(i2,j2)>maxC1(i1,j1)
maxC1(i1,j1)=C1(i2,j2);
maxC1x(1,i1)=i2;
maxC1y(1,j1)=j2;
end
end
end
end
end
end
不能像二楼的那样改啊,这个就是要针对每一对i1,j1,都要使i2,j2循环300次哦,你那样改了之后就不对了呢 展开
load('D:\MATLAB7\work\J1.mat'); load('D:\MATLAB7\work\J2.mat');
J1=double(J1);J2=double(J2);
[Height,Width]=size(J1);
J1p=zeros([Height Width]); %300*300
J2p=zeros([Height Width]);
C11=zeros([Height Width]);
C12=zeros([Height Width]);
C13=zeros([Height Width]);
C1=zeros([Height Width]);
maxC1=zeros([Height Width]);
maxC1x=zeros([1 Width]);
maxC1y=zeros([1 Width]);
for i1=2:Height-1
for j1=2:Width-1
if J1(i1,j1)==0
maxC1(i1,j1)=0;
else
J1n=J1(i1-1:i1+1,j1-1:j1+1);
J1np=mean(J1n(:));
J1n=abs(J1n-J1np);
C12(i1,j1)=sum(J1n(:).^2);
for i2=2:Height-1
for j2=2:Width-1
if J2(i2,j2)==0
C1(i2,j2)=0;
else
J2n=J2(i2-1:i2+1,j2-1:j2+1);
J2np=mean(J2n(:));
J2n=abs(J2n-J2np);
C13(i2,j2)=sum(J2n(:).^2);
C11(i2,j2)=sum(sum(J1n.*J2n));
C1(i2,j2)=C11(i2,j2)./(sqrt(C12(i1,j1)).*sqrt(C13(i2,j2)));
end
if C1(i2,j2)>maxC1(i1,j1)
maxC1(i1,j1)=C1(i2,j2);
maxC1x(1,i1)=i2;
maxC1y(1,j1)=j2;
end
end
end
end
end
end
不能像二楼的那样改啊,这个就是要针对每一对i1,j1,都要使i2,j2循环300次哦,你那样改了之后就不对了呢 展开
4个回答
展开全部
为什么要四重循环?复杂度是300*300*300*300,计算机怎么可能完成?
load('D:\MATLAB7\work\J1.mat'); load('D:\MATLAB7\work\J2.mat');
J1=double(J1);J2=double(J2);
[Height,Width]=size(J1);
J1p=zeros([Height Width]); %300*300
J2p=zeros([Height Width]);
C11=zeros([Height Width]);
C12=zeros([Height Width]);
C13=zeros([Height Width]);
C1=zeros([Height Width]);
maxC1=zeros([Height Width]);
maxC1x=zeros([1 Width]);
maxC1y=zeros([1 Width]);
for i1=2:Height-1
for j1=2:Width-1
if J1(i1,j1)==0
maxC1(i1,j1)=0;
else
J1n=J1(i1-1:i1+1,j1-1:j1+1);
J1np=mean(J1n(:));
J1n=abs(J1n-J1np);
C12(i1,j1)=sum(J1n(:).^2);
end
if J2(i1,j1)==0
C1(i1,j1)=0;
else
J2n=J2(i1-1:i1+1,j1-1:j1+1);
J2np=mean(J2n(:));
J2n=abs(J2n-J2np);
C13(i1,j1)=sum(J2n(:).^2);
C11(i1,j1)=sum(sum(J1n.*J2n));
C1(i1,j1)=C11(i1,j1)./(sqrt(C12(i1,j1)).*sqrt(C13(i1,j1)));
end
if C1(i1,j1)>maxC1(i1,j1)
maxC1(i1,j1)=C1(i1,j1);
maxC1x(1,i1)=i1;
maxC1y(1,j1)=j1;
end
end
end
load('D:\MATLAB7\work\J1.mat'); load('D:\MATLAB7\work\J2.mat');
J1=double(J1);J2=double(J2);
[Height,Width]=size(J1);
J1p=zeros([Height Width]); %300*300
J2p=zeros([Height Width]);
C11=zeros([Height Width]);
C12=zeros([Height Width]);
C13=zeros([Height Width]);
C1=zeros([Height Width]);
maxC1=zeros([Height Width]);
maxC1x=zeros([1 Width]);
maxC1y=zeros([1 Width]);
for i1=2:Height-1
for j1=2:Width-1
if J1(i1,j1)==0
maxC1(i1,j1)=0;
else
J1n=J1(i1-1:i1+1,j1-1:j1+1);
J1np=mean(J1n(:));
J1n=abs(J1n-J1np);
C12(i1,j1)=sum(J1n(:).^2);
end
if J2(i1,j1)==0
C1(i1,j1)=0;
else
J2n=J2(i1-1:i1+1,j1-1:j1+1);
J2np=mean(J2n(:));
J2n=abs(J2n-J2np);
C13(i1,j1)=sum(J2n(:).^2);
C11(i1,j1)=sum(sum(J1n.*J2n));
C1(i1,j1)=C11(i1,j1)./(sqrt(C12(i1,j1)).*sqrt(C13(i1,j1)));
end
if C1(i1,j1)>maxC1(i1,j1)
maxC1(i1,j1)=C1(i1,j1);
maxC1x(1,i1)=i1;
maxC1y(1,j1)=j1;
end
end
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?

2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
展开全部
function fgoal
clear;clc;
x0=[0 0 0 0];%x的初值,随便给啦
goal=[1 1 1 1]; %目标值,本题也可以随便给啦
weight=[1 1 1 1]; %权重值,本题也可以随便给啦
A=[-1 0 0 0;0 -1 0 0; 0 0 -1 0;0 0 0 -1]; %xi>0(i=1,2,3,4) 化成标准形xi<=0
B=[0;0;0;0]
Aeq=[1 1 1 1];%∑xi=1;
Beq=1;
[X,FVAL,ATTAINFACTOR,EXITFLAG]=fgoalattain(@fun,x0,goal,weight,A,B,Aeq,Beq)
function f=fun(x)
f(1)=15.4*x(1)+13.0*x(2)+13.6*x(3)+20.6*x(4);
f(2)=-(36.4*x(1)+43.1*x(2)+41.2*x(3)+28.2*x(4));
f(3)=2.75*x(1)+2.32*x(2)+2.42*x(3)+3.68*x(4);
f(4)=2.20*x(1)+1.80*x(2)+1.20*x(3)+9.60*x(4);
运行结果:
X = -0.0000 1.0000 0 0.0000
FVAL = 13.0000 -43.1000 2.3200 1.8000
clear;clc;
x0=[0 0 0 0];%x的初值,随便给啦
goal=[1 1 1 1]; %目标值,本题也可以随便给啦
weight=[1 1 1 1]; %权重值,本题也可以随便给啦
A=[-1 0 0 0;0 -1 0 0; 0 0 -1 0;0 0 0 -1]; %xi>0(i=1,2,3,4) 化成标准形xi<=0
B=[0;0;0;0]
Aeq=[1 1 1 1];%∑xi=1;
Beq=1;
[X,FVAL,ATTAINFACTOR,EXITFLAG]=fgoalattain(@fun,x0,goal,weight,A,B,Aeq,Beq)
function f=fun(x)
f(1)=15.4*x(1)+13.0*x(2)+13.6*x(3)+20.6*x(4);
f(2)=-(36.4*x(1)+43.1*x(2)+41.2*x(3)+28.2*x(4));
f(3)=2.75*x(1)+2.32*x(2)+2.42*x(3)+3.68*x(4);
f(4)=2.20*x(1)+1.80*x(2)+1.20*x(3)+9.60*x(4);
运行结果:
X = -0.0000 1.0000 0 0.0000
FVAL = 13.0000 -43.1000 2.3200 1.8000
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
做matlab程序的一个原则是在复杂度不变的情况下,尽量用矩阵运算代替循环运算以节省时间。这段程序中C12和C13的求法都可以转化为矩阵计算,但是C11由于对矩阵的局部做了循环相乘,这里很难改成对整个矩阵的运算。
所以最好是能修改一下算法,降低复杂度。或者避免矩阵的局部循环相乘。
所以最好是能修改一下算法,降低复杂度。或者避免矩阵的局部循环相乘。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言,`?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询