出错 fitcal (第 12 行) x2b1=x2b(1:hiddennum).'; 怎么解决

clc
clear all
%一、初始化部分
%1.1 预处理样本数据
load 'm_data2.txt';
M=m_data2;
p1=M(1:30,1:5);
t1=M(1:30,6);
p=p1';t=t1';
[pn,minp,maxp,tn,mint,maxt]=premnmx(p,t);
p_test=M(31:35,1:5);
t_test=M(31:35,6);
p_test=p_test';
t_test=t_test';
[p_testn,minp_test,maxp_test,t_testn,mint_test,maxt_test]=premnmx(p_test,t_test);
testIn=p_testn;
testOut=t_testn;
global Ptrain;
Ptrain=pn;
global Ttrain;
Ttrain=tn;
%1.2 设置神经网络参数
global indim;    %输入层神经元个数
indim=5;
global hiddennum; %隐藏层神经元个数
hiddennum=20;
global outdim;   %输出层神经元个数
outdim=1;
global Gpos;
%1.3 设置微粒群参数
vmax=0.5;      % 速度上限
minerr=1e-7;    % 目标误差
wmax=0.95;
wmin=0.25;
global itmax;  % 最大迭代次数
itmax=200;
c1=1.5;
c2=1.5;
%权值随迭代次数线性递减以保证收敛
for  iter=1:itmax
    W(iter)=wmax-((wmax-wmin)/itmax)*iter;
end
a=-1;
b=1;
m=-1;
n=1;
global N;  % 微粒个数
N=30;
global D;  % 每个微粒的维数
D=(indim+1)*hiddennum+(hiddennum+1)*outdim;  %所有权值和阈值
% 初始化微粒位置
rand('state',sum(100*clock));  %产生和时间相关的随机数
global X;
X=a+(b-a)*rand(N,D,1);   %X的值在a 和b之间
%初始化微粒速度
V=m+(n-m)*rand(N,D,1);  %V的值在m和n之间

%二、微粒群更新迭代部分
%global net;
net=newff(minmax(pn),[hiddennum,outdim],{'tansig','purelin'},'traingdx');
global gbest;  %全局最优位置
global pbest;  %局部最优位置
%2.1第一次迭代
fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain); %计算适应值
[C,I]=min(fitness(:,1,1));  %第一代,返回微粒群中最小适应值给C,该微粒的序号给I
L(:,1,1)=fitness(:,1,1);    %第一代,每个微粒的适应值
B(1,1,1)=C;            %第一代,全局最优适应值(B存储当前代最优适应值)
bestminimum(1)=C;     % bestminimum存储所有代中的全局最小适应值
gbest(1,:,1)=X(I,:,1);    %第一代,全局最优的微粒位置
for  p=1:N
    G(p,:,1)=gbest(1,:,1);  %G便于速度更新运算(函数格式统一)
end
Gpos=gbest(1,:,1);
for  i=1:N;
    pbest(i,:,1)=X(i,:,1);   %因为是第一代,当前位置即为历史最优位置
end
V(:,:,2)=W(1)*V(:,:,1)+c1*rand*(pbest(:,:,1)-X(:,:,1))+c2*rand*(G(:,:,1)-X(:,:,1));  % 更新速度
% 判断速度是否越界
for ni=1:N
    for di=1:D
        if V(ni,di,2)>vmax
            V(ni,di,2)=vmax;
        else if V(ni,di,2)<-vmax
                V(ni,di,2)=-vmax;
            else
                V(ni,di,2)=V(ni,di,2);
            end
        end
    end
    X(:,:,2)=X(:,:,1)+V(:,:,2);   %更新位置
end
%disp('执行到这里')
%2.2 第2次到最后一次迭代
for j=2:itmax
    h=j;
    disp('迭代次数,当前代全局最佳适应值,本代以前所有代中的全局最佳适应值')
    disp(j-1)
    disp(B(1,1,j-1))         %j-1代全局最优适应值
    disp(bestminimum(j-1))  %j-1代以前所有代中的全局最优适应值
    disp('******************************')
    fitness=fitcal(X,indim,hiddennum,outdim,D,Ptrain,Ttrain);
    [C,I]=min(fitness(:,1,j));  %第j代的最优适应值和最优微粒序号
    L(:,1,j)=fitness(:,1,j);     %第j代每个微粒的适应值
    B(1,1,j)=C;             %第j代全局最优适应值
    gbest(1,:,j)=X(I,:,j);      %第j代全局最优微粒的位置
    [GC,GI]=min(B(1,1,:));   %所有代的全局最优适应值赋给GC,代数赋给GI
    bestminimum(j)=GC;    %所有代的最优适应值赋给j代的bestminimum
    % 判断是否符合条件
    if  GC<=minerr
        Gpos=gbest(1,:,GI);  %若满足均方误差条件,记录最优位置,停止迭代
        break
    end
    if  j>=itmax
        break      %超过最大迭代次数时,退出
    end
    %计算历史全局最优位置
    if  B(1,1,j)<GC
        gbest(1,:,j)=gbest(1,:,j);
    else
        gbest(1,:,j)=gbest(1,:,GI);
    end
    for  p=1:N
        G(p,:,j)=gbest(1,:,j);
    end
    %计算各微粒历史最优位置
    for  i=1:N;
        [C,I]=min(L(i,1,:));  %计算每个微粒的历史最优适应值,赋给C,代数赋给I
        if L(i,1,j)<=C
            pbest(i,:,j)=X(i,:,j);
        else
            pbest(i,:,j)=X(i,:,I);
        end
    end
    V(:,:,j+1)=W(j)*V(:,:,j)+c1*rand*(pbest(:,:,j)-X(:,:,j))+c2*rand*(G(:,:,j)-X(:,:,j));
    for ni=1:N
        for di=1:D
            if V(ni,di,j+1)>vmax
                V(ni,di,j+1)=vmax;
            else  if V(ni,di,j+1)<-vmax
                    V(ni,di,j+1)=-vmax;
                else
                    V(ni,di,j+1)=V(ni,di,j+1);
                end
            end
        end
        X(:,:,j+1)=X(:,:,j)+V(:,:,j+1);
        %   %2.3 将最优微粒(即最优权值和阈值)赋给神经网络
            if j==itmax
              Gpos=gbest(1,:,GI);
            end

    end
end
%三、神经网络训练部分
%****************************************************************************
%---------------------nn--part---------------------------------------
% simulation network
for t=1:hiddennum
    x2iw(t,:)=gbest(1,((t-1)*indim+1):t*indim,j);
end
for r=1:outdim
    x2lw(r,:)=gbest(1,(indim*hiddennum+1):(indim*hiddennum+hiddennum),j);
end
x2b=gbest(1,((indim+1)*hiddennum+1):D,j);
x2b1=x2b(1:hiddennum).';
x2b2=x2b(hiddennum+1:hiddennum+outdim).';
net.IW{1,1}=x2iw;
net.LW{2,1}=x2lw;
net.b{1}=x2b1;
net.b{2}=x2b2;
net.trainparam.show=500;
net.trainparam.epochs=15000;
net.trainparam.goal=0.001;
[net,tr]=train(net,pn,tn);

y1=sim(net,testIn);
testout=postmnmx(y1,mint,maxt)
Ttest=postmnmx(testOut,mint_test,maxt_test);
figure(1);
plot(Ttest,'g-+')
hold on
plot(testout,'r--*')
legend('实际输出','预测输出')
title('PSO_BP网络预测输出','fontsize',12)
ylabel('输出','fontsize',12)
xlabel('样本','fontsize',12)
%testout=reshape(testout,5,1);
error=abs(testout-Ttest);

figure(2)
plot(error,'-*')
title('PSO_BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
%echo off
% 适应函数fitness
function fitval = fitcal(pm,net,indim,hiddennum,outdim,D,Ptrain,Ttrain,minAllSamOut,maxAllSamOut)
[x,y,z]=size(pm);
for i=1:x
for j=1:hiddennum
x2iw(j,:)=pm(i,((j-1)*indim+1):j*indim,z);
end
for k=1:outdim
x2lw(k,:)=pm(i,(indim*hiddennum+1):(indim*hiddennum+hiddennum),z);
end
x2b(1,((indim+1)*hiddennum+1):D,j)=pm(1,((indim+1)*hiddennum+1):D,j);
x2b1=x2b(1:hiddennum).';
x2b2=x2b(hiddennum+1:hiddennum+outdim).';
net.IW{1,1}=x2iw;
net.LW{2,1}=x2lw;
net.b{1}=x2b1;
net.b{2}=x2b2;
error=sim(net,Ptrain)-Ttrain;
fitval(i,1,z)=mse(error);
end

 

有数据集吗?