آره. برای اینکه متغیر سراسری تعریف کنید دستور زیر رو در کد اصلی و کد تابع قرار بدید (بهتره قبل از مقداردهیش باشه):
global var
البته چون چند تا متغیر سراسری داریم میشه این جوری هم نوشتش:
global var Data
بعدش به جای اینکه نقطه اول رو رسم کنید (یا در کنار رسم نقطه ی اول) کد زیر رو اضافه کنید:
var(1,:)=Data(1,:)
یا در خط پنجم تابع (و همچنین در کنار رسم نقطه ی آخر)، کد زیر رو اضافه کنید:
var(end+1,:)=Data(k,:)
مهندس انجام دادم. نشد!
توی خط 31 اضافه کردم.
clc ;
clear ;
close all ;
% global Data
global var Data
Data = xlsread('C:\Users\User\Desktop\Pareto Front\2\natayej1.xlsx',1);
% save Data.mat
% load('Data.mat');
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
min_inx_g=find(Data(:,2)==min(Data(:,2)));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
var(1,:)=Data(1,:)
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
axis([0 5 0 3])
تابع هم باید تغییر کنه. اندیس ها رو فک کنم اشتباه گذاشتید. منظورم این طوری بود:
کد اصلی:
clc
clear
close
global Data var
Data=[1 4
1.6 45
8 12
1.7 2
2.2 31
4 12
5.5 6
9 15
2.4 1];
Data=sortrows(Data);
plot(Data(1,1),Data(1,2),'ro','markersize',8) % plot first point
hold on
var(1,:)=Data(1,:);
min_inx_g=find(Data(:,2)==min(Data(:,2)));
plot(Data(min_inx_g,1),Data(min_inx_g,2),'ro','mar kersize',8) % plot min point
var(end+1,:)=Data(min_inx_g,:);
min_inx=min_inx_g;
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(1,min_inx);
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(end,1),Data(end,2),'ro','markersize',8) % plot end point
min_inx=min_inx_g;
var(end+1,:)=Data(end,:);
while 1
if min_inx~=length(Data)
[k is_upper]=plot_min_point(min_inx,length(Data));
if is_upper==1 % there are no points above the line.
break
end
min_inx=k;
else
break
end
end
plot(Data(:,1),Data(:,2),'b*')
var=sortrows(var);
% axis([0 5 0 3])
تابع:
function [k is_upper]=plot_min_point(i,j)
global Data var
is_upper=[];
for k=j-1:-1:i+1
if ~(Data(k,2)>Data(i,2)+(Data(j,2)-Data(i,2))/(Data(j,1)-Data(i,1))*(Data(k,1)-Data(i,1)))
plot(Data(k,1),Data(k,2),'ro','markersize',8)
var(end+1,:)=Data(k,:);
if k==2
is_upper=0;
end
break;
else
if k==2
is_upper=1;
end
end
end
end
البته برای داده های خودتون باید تغییرش بدید.
مهندس سلام.
ببخشید این کد مگه نقاط دو ستون آخر رو پلات نمیکنه؟؟؟
پس چرا اون نقاط مرزی که با قرمز مشخص شده توی دو ستون آخر نیست؟
داده هام رو با دو فرمت mat و xlsx در لینک زیر قرار دادم:
سلام
اون کد، مینیمم داده های زیر رو رسم میکنه:
Data=[1 4 1.6 45 8 12
1.7 2
2.2 31
4 12
5.5 6
9 15
2.4 1];
همون تغییراتی که توی کد اول اعمال کردید، روی این هم اعمال کنید تا داده های خودتون رو رسم کنه. مثلا این خط:
Data = xlsread('C:\Users\User\Desktop\Pareto Front\2\natayej1.xlsx',1);
ضمنامتوجه نشدم منظورتون از نقاط مرزی رو کدومه ...
یه سوال دیگه هم دارم اینه که چطوری میتونم یه ماتریسی که با فایل dat ذخیره شده رو به اکسل تبدیل کنم؟
من با دستور زیر انجام میدم ولی خطا میده :لینک داده :
xlswrite('natayej.xlsx',matt)
http://www.sharefile.ir/uploads/1498708715.rar