sun1993 发表于 2007-10-25 13:58

Matrix dimensions must agree 出错

正在编一个遗传算法的小程序,运行出来这东东
??? Error using ==> times
Matrix dimensions must agree.

Error in ==> GA at 7
pop(:,stringlength+1)=sum(2.^(size(pop(:,1:stringlength2),2)-1:-1:0).*pop(:,1:stringlength2))*(b-a)/(2.^stringlength2-1)+a;
可我没觉得有错呀, 请教大家,谢谢

[ 本帖最后由 eight 于 2007-10-25 16:49 编辑 ]

花如月 发表于 2007-10-25 14:09

不要你觉得没错,维数不匹配。仔细检查下等号2端

sun1993 发表于 2007-10-25 16:08

还是没能看出来, 貌似退化到学前班了

花如月 发表于 2007-10-25 16:37

回复 #3 sun1993 的帖子

后边的表达式太长,看起来当然比较困难。我的意思是让你把等号右边的结果计算出来,看一下它的size。然后保证pop(:,stringlength+1)的size和刚才的相等,这样问题自然就解决了。

如果计算后便的表达式也出现同样的警告,那就检查表达式中参与运算的元素,直到找出问题所在。表达式写得长,虽然程序看起来会简短一些。但是对排查错误不利,所以如果是自己写程序。要先繁后简,先保证没有错误,然后再对一些语句进行合并。

[ 本帖最后由 eight 于 2007-10-25 17:36 编辑 ]

sun1993 发表于 2007-10-26 23:47

改成 pop(:,stringlength+1)=2.^(size(pop(:,1:stringlength2),2)-1:-1:0)*pop(:,1:stringlength2)';就可以了
果然是自己错了,遇到问题得多动动手.
谢谢花如月版主:@)

不过有点不明白, 令
popsize=10;stringlength=33;stringlength2=18;
pop=round(rand(popsize,stringlength+3));
A=2.^(size(pop(:,1:stringlength2),2)-1:-1:0)怎么维数是1*18而不是10*18?
不明白,请教大家,谢谢

[ 本帖最后由 sun1993 于 2007-10-27 00:00 编辑 ]

sun1993 发表于 2007-10-28 00:13

不好意思,又犯了个低级错误了, 哈. 
size只是返回一个数,而不是矩阵.
应该是如何改,使A=2.^(size(pop(:,1:stringlength2),2)-1:-1:0)变成10*18维呢?

[ 本帖最后由 sun1993 于 2007-10-28 00:16 编辑 ]

花如月 发表于 2007-10-28 09:05

回复 #6 sun1993 的帖子

你程序写的让别人不容易看懂:@L

程序有时候并不是单给自己看的,良好的编程习惯也很重要

sun1993 发表于 2007-10-28 12:25

维数的问题貌似已经解决,但是程序还是有问题,大家帮忙看一下,哈

目标函数: (用了内点惩罚函数法)
function z=myfun5(x1,x2)
z=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
g=[-x1-3.0 x1-12.1 -x2+4.1 x2-5.8];B=sum(1./g);
global k;
z=-(z+0.5^k*B);
遗传算法:
%Simple Genetic Algorithm
clear;clc;tic;
%initialise
popsize=10;stringlength=33;stringlength2=18;pc=0.9;pm=0.01;
a=-3.0;b=12.1;c=4.1;d=5.8;
pop=round(rand(popsize,stringlength+3));
pop(:,stringlength+1)=2.^(size(pop(:,1:stringlength2),2)-1:-1:0)*pop(:,1:stringlength2)'*(b-a)/(2.^stringlength2-1)+a;
pop(:,stringlength+2)=2.^(size(pop(:,stringlength2+1:stringlength),2)-1:-1:0)*pop(:,stringlength2+1:stringlength)'*(d-c)/(2.^(stringlength-stringlength2)-1)+c;
pop(:,stringlength+3)=myfun5(pop(:,stringlength+1:stringlength+2));

for T=1:100
%roulette selection
totalfit=sum(pop(:,stringlength+3));
prob=pop(:,stringlength+3)./totalfit;
prob=cumsum(prob);
rns=sort(rand(popsize,1));
fitin=1;newin=1;
while newin<=popsize
    if rns(newin)<prob(fitin)
      pop(newin,:)=pop(fitin,:);
      newin=newin+1;
    else
      fitin=fitin+1;
    end
end

%crossover
for i=1:2:popsize-1
    if rand<pc
      cpoint=round(rand*(stringlength-2))+1;
      pop(i,:)=;
      pop(i+1,:)=;
    end
end

%mutation
for i=1:popsize
    if rand<pm
      mpoint=round(rand*(stringlength-1))+1;
      pop(i,mpoint)=1-pop(i,mpoint);
    end
end

%new pop
pop(:,stringlength+1)=2.^(size(pop(:,1:stringlength2),2)-1:-1:0)*pop(:,1:stringlength2)'*(b-a)/(2.^stringlength2-1)+a;
pop(:,stringlength+2)=2.^(size(pop(:,stringlength2+1:stringlength),2)-1:-1:0)*pop(:,stringlength2+1:stringlength)'*(d-c)/(2.^(stringlength-stringlength2)-1)+c;
pop(:,stringlength+3)=myfun5(pop(:,stringlength+1:stringlength+2));

end

%result
=max(pop(:,stringlength+3));
x1=2.^(size(pop(h,1:stringlength2),2)-1:-1:0)*pop(h,1:stringlength2)'*(b-a)/(2.^stringlength2-1)+a;
x2=2.^(size(pop(:,stringlength2+1:stringlength),2)-1:-1:0)*pop(:,stringlength2+1:stringlength)'*(d-c)/(2.^(stringlength-stringlength2)-1)+c;
toc;
x=

??? Input argument "x2" is undefined.
Error in ==> myfun5 at 2
z=21.5+x1.*sin(4*pi*x1)+x2.*sin(20*pi*x2);
Error in ==> GA at 9
pop(:,stringlength+3)=myfun5(pop(:,stringlength+1:stringlength+2));

唉,为什么自己觉得对的总是出错呢:@L

[ 本帖最后由 sun1993 于 2007-10-28 12:28 编辑 ]

花如月 发表于 2007-10-28 13:13

回复 #8 sun1993 的帖子

先弄明白程序的思路,然后读懂每句的作用。

不是自己写的程序就更要费些功夫,所有的错误提示在常见错误及解决办法帖子里都有。

如果实在觉得费力,还不如自己从头写起,有时候读懂别人的程序似乎比自己写更费劲
页: [1]
查看完整版本: Matrix dimensions must agree 出错