필터 지우기
필터 지우기

Assign Multiple variable error

조회 수: 1 (최근 30일)
Zafer Sahin
Zafer Sahin 2022년 4월 21일
댓글: Mitch Lautigar 2022년 4월 21일
I write to code about optimization algorithm. When I use code block as a;
function z=Sphere(x)
z=sum(x.^2);
The codes run succesfully But I want to use two variables x and y. instead of this, I write
function z=Sphere(x,y)
z=sum(x.^2,y.^2);
It giver error:
Not enough input arguments.
If you help about source of eror codes, I will appreciate. Thanks
function []=DEA()
rng('default')
N=10;
F=0.8;
CR=0.9;
max_iter=5;
D=5;
low=-100;
high=100;
Fonksiyon='Sphere';
function z=Sphere(x)
z=sum(x.^2);
end
obj=zeros(1,N);
mutant=zeros(N,D);
for i=1:N
for j=1:D
pop(i,j)=low+rand()*(high-low);
end
obj(1,i)=eval(strcat(Fonksiyon,'(pop(i,:))'));
end
[minimum,min_indis]=min(obj);
bestParams=pop(min_indis,:);
mins=zeros(1,max_iter);
sayac=0;
iterasyon=1;
while (iterasyon<=max_iter)
for i=1:N
n1=fix(rand*N)+1;
while(i==n1)
n1=fix(rand*N)+1;
end
n2=fix(rand*N)+1;
while(i==n2||n1==n2)
n2=fix(rand*N)+1;
end
n3=fix(rand*N)+1;
while(i==n3||n1==n3||n2==n3)
n3=fix(rand*N)+1;
end
for j=1:D
mutant(i,j)=pop(n3,j)+(pop(n1,j)-pop(n2,j))*F;
if mutant(i,j)>high
mutant(i,j)=high;
end
if mutant(i,j)<low
mutant(i,j)=low;
end
end
trial=zeros(N,D);
j=fix(rand*D)+1;
for k=1:D
if rand<CR || k==j
trial(i,k)=mutant(i,k);
else
trial(i,k)=pop(i,k);
end
end
score=eval(strcat(Fonksiyon,'(trial(i,:))'));
if score<obj(1,i)
obj(1,i)=score;
pop(i,:)=trial(i,:);
end
if score<minimum
minimum=score;
bestParams=trial(i,:);
end
end
fprintf('Iterasyon=%d .... En Küçük Değer=%g\n',iterasyon,minimum);
mins(iterasyon)=minimum;
iterasyon=iterasyon+1;
end
end
  댓글 수: 5
Zafer Sahin
Zafer Sahin 2022년 4월 21일
편집: Zafer Sahin 2022년 4월 21일
Ok I understand thank you. But I wonder How I write "x1" and "x2" in be the same dimensions to not give error.
Mitch Lautigar
Mitch Lautigar 2022년 4월 21일
"But I wonder How I write "x1" and "x2" in be the same dimensions to not give error."
x1 an x2 are inputs that you provide. You can either reshape the data (google MATLAB reshape) or you can add logic to sum the arrays regardless if they are the same size (see my code below).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------------------------------------------------------------------------%
%Get simple math out of way
x1_1 = x1.^2;
x2_1 = x2.^2;
%------------------------------------------------------------------------%
%If statement to handle variable length x arrays
%if x1_1 is longer than x2_1
if length(x1_1) > length(x2_1)
x1_1(1:length(x2_1) = x1_1(1:length(x2_1))+x2_1;
output_x = sum(x1_1);
%if x2_1 is longer than x1_1
elseif length(x1_1) < length(x2_1)
x2_1(1:length(x1_1) = x2_1(1:length(x1_1))+x1_1;
output_x = sum(x2_1);
%arrays are same length
else
output_x = sum(x1_1 + x2_1);
end
%end suggested code
%------------------------------------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
This logic will add the values together and then sum them up regardless of the dimensions. I don't think their is a logic issue in my indexing, but you are welcome to try this food for thought and play around with it. If their is an issue, let me know.

댓글을 달려면 로그인하십시오.

답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by