matlab 不允许函数定义,求解决: 错误: 此上下文中不允许函数定义。

function[z,ans]=fenpei(marix)

%///

%俞入效率矩阵marix为方阵;

%若效率矩阵中有M则用一充分大的数代替;

%输出z为最优解,ans为最优分配矩阵;

%//

a=m arix;

b=a;

%确定矩阵维数

s=size(a);

%确定矩阵行最小值,进行行减

ml=min(a);

For i=1:s

a(i,:)=a(i,:)-ml(i);

end

%确定矩阵列最小值,进行列诚

mr=min(a);

for j=1:s

a(:,j)=a(:,j)-mr(j);

end

我把上面的弄了M文件,还是有问题,求指导

% start working

num=0;

while(num~=s)  %终止条件是“(0)”的个数与矩阵的维数相同

%index用以标记矩阵中的零元素,若a(i.j)=0,则index(i,j)=1否则index(ij)=0

index=ones(s);

index=a&index;

index=~index;

%flag用以标记划线位,flag=0表示未被划线,

%flag=1表示有划线过,flag=2表示为两直线交点

%ans用以记录a中“(0)”的位置

%循环后重新初始化flag,ans

flag = zeros(s);

ans = zeros(s);

%一次循环划线全过程,终止条件是所有的零元素均被直线覆盖,

%即在flag>0位index=0

while(sum(sum(index)))

%按行找出“(0)”所在位置,并对“(0)”所在列划线,

%即设置flag.同时修改index,将结果填入ans

for i=1:s

t=0;

l=0;

forj=1:s

if(flag(i,j)==0&&index(i,j)==1)

l=l+1;

t=j;

end

end

if(l==1)

flag(:,t)=flag(:,t)+1;

index(:,t)=0;

ans(i,t)=1;

end

end

%按列找出“(0)”所在位置,并对“(0) "所在行划线,

%即设置flag.同时修改index 将结果填入ans

for j=1:s

t=0;

r=0;

for i=1:s

if(flag(i,j)==0&&index(i,j)==1)

r=r+1;

t=I;

end

end

if(r==1)

flag(t,:)=flag(t,:)+1;

index(t,:)=0;

ans(t,j)=1;

end

end

end %对while(sum(sum(index)))

%处理过程

%计数器:计算ans中1的个数,用num表示

num=sum(sum(ans));

%判断是否可以终止,若可以则跳出循环

if(s==num)

break;

end

%否则,进行下一步处理

%确定未被划线的最小元素,用m表示

m=max(max(a));

for i=1:s

for j=1:s

if(flag(i,j)==0)

if(a(i,j)

m=a(i,j);

end

end

end

end

%未被划线,即flag=0处减去m;线交点,即flag=2处加上m

for i=1:s

for j=1:s

if(flag(i,j)==0)

a(i,j)=a(i,j)-m;

end

if(flag(i,j)==2)

a(i,j)=a(i,j)+m;

end

end

end

end

%对while(num~=s)

%计算最优(min)值

zm=ans.*b;

z=0;

z=sum(sum(zm));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值