208 views (last 30 days)

Write a function called get_distance that accepts two character vector inputs representing the names of two cities. The function returns the distance between them as an output argument called distance. For example, the call get_distance('Alexandria, VA' , 'Allentown, PA') should return 195

. If one or both of the specified cities are not in the file, the function returns -1.

The code I tried is the following:

I get error in the " if text{i,1} == a" and "if text{1,j} == b" lines stating matrix dimensions must agree. Will be really helpful if someone can help me with it.

function distance = get_distance(a,b)

[~,text,raw] = xlsread('Distances.xlsx');

for i = 2 : size(text,1)

if text{i,1} == a

for j = 1 : size(text,2)

if text{2,j} == b

distance = raw{i,j};

else

distance = -1;

end

end

else

distance = -1;

end

end

Geoff Hayes
on 17 Feb 2019

Ajai - if you try to compare strings using the == operator, then you will see this error if the two strings being compared are of different lengths. Instead, you should be using strcmp or strcmpi to check for equality between two strings. Your code would then change from

text{i,1} == a

to

strcmp(text{i,1}, a)

Also, rather than using a loop, you could use find to see if the first column of text contains the cities that you are looking for (see the examples in the provided link for details).

Tashu Bar
on 16 Mar 2019

I am facing some issue in writing code using find for simillar problem.

Geoff can you help to write the code,

Walter Roberson
on 23 Mar 2019

ABINAND PANDIYAN
on 24 Apr 2020

Edited: ABINAND PANDIYAN
on 25 Apr 2020

% This problem is right I think.

function distance = get_distance(A,B)

[~,~,dist] = xlsread('Distances.xlsx');

for i=2:(size(dist,1)+1)

if i>size(dist,1)

distance=-1;

return

end

if strcmp(dist{i,1}, A)

break

end

end

for j=2:(size(dist,2)+1)

if j> size(dist,2)

distance=-1;

return

end

if strcmp(dist{1,j}, B)

distance=dist{i,j};

break

end

end

end

Walter Roberson
on 24 Apr 2020

Suppose that A happens to exactly match the city name in the last row. Then i = size(dist,1) and success would be desired. The for loop would execute and on the last iteration, strcmp(dist{i,1},A) would succeed, so you would break; with i = size(dist,1). Then you do if i>=size(dist,1) and find that i == size(dist,1) so the if succeeds, and you declare the distance to be -1 and return, even though you had a match.

In the case where there was no match at all, the for i loop would complete, and afterwards i would be size(dist,1), same as if there had been a match on the last item. You test i>=size(dist,1) and that is true so you return -1, same as the case where you had a city match on the last row.

In MATLAB, after a for loop, if the body of the for did not change the loop variable, then the loop control variable is left at the last value it had, not one more than the last value it had. You will need to fix that termination condition.

ABINAND PANDIYAN
on 25 Apr 2020

@Walter Roberson

Yeah I checked that, But now after hours of brainstroming I think I got the answer right with the edited content. You can check it now.

Olel Arem
on 1 May 2020

Edited: Olel Arem
on 1 May 2020

function distance=get_distance(city_1,city_2)

n=0;m=0;

[value,name]=xlsread('Distances.xlsx');

for ii=1:size(name,2)

if (strcmp(city_1,name(ii,1)))

n=ii;

end

end

for jj=1:size(name,1)

if (strcmp(city_2,name(1,jj)))

m=jj;

end

end

if(n==0 && m==0 && n==1&&m==1)

distance =-1;

elseif (n>0&&m>0)

distance=value(n-1,m-1);

else

distance=-1;

end

Muhammad Qaisar Ali
on 27 Jun 2020

function distance = get_distance(city_1,city_2)

persistent distt city_names;

if isempty(distt) && isempty(city_names) % Ceck wheater first time load or not.

[distt,city_names,~]=xlsread('Distances.xlsx'); % Reading ditances and names of cities

end

rowIndex = find(ismember(city_names(:,1),city_1)); % Searching city_1 in col_1 of excell seet.finding row index.

colIndex = find(ismember(city_names(1,:),city_2)); % Searching city_2 in row_1 of excell seet.finding col index.

if isempty(rowIndex) || isempty(colIndex) % If cities nit found return -1.

distance=-1;

else % Find and retun distance.

distance=distt(rowIndex-1,colIndex-1);

end

end

Walter Roberson
on 27 Jun 2020

Priyamvada Shankar
on 22 Mar 2019

Siddharth Vidyarthi
on 29 Mar 2019

so how should i end the loop after that please help me i am getting error again and again

Fazlul Haque
on 15 May 2020

done without using loops

Krashank Kulshrestha
on 4 Jun 2020

Walter Roberson
on 4 Jun 2020

It is a requirement of the assignment, ". If one or both of the specified cities are not in the file, the function returns -1."

In terms of why, the answer is that it is valid for someone to ask about the distance between a city and the same city, and the distance that should be returned for that would be 0. If you returned 0 for unknown cities as well, then the 0 that was returned for city-to-itself could not be distinguished from the 0 that would be returned for the unknown-city case.

The place I live now, historically was a small village. There was a slightly larger village what is now two blocks away, half a kilometre. But historically miles were used, and to the nearest mile, the distance rounds down to 0. It is valid to ask about the distance between the two places, and the answer would be validly 0 ("to the nearest mile"), and that is a different situation than asking about the distance and being given a response that does not allow me to tell whether the two places are very close or if it does not have any information about one of the places.

Dannana Bharath kumar
on 1 Jun 2020

function distance=get_distance(a,b)

[~,txt,~]=xlsread('Distances.xlsx',1,'A2:Z337');

[num,~,~]=xlsread('Distances.xlsx');

g=size(num);

everything=txt';

t=length(everything);

dus=0;

ds=0;

for i=1:length(everything)

if strcmp(a,everything{i})==logical(1)

a=i;

for i=1:length(everything)

if strcmp(b,everything{i})==logical(1)

b=i;

distance=num(a,b)

break

else

dus=dus+1;

end

end

break

else

ds=ds+1;

end

end

dus

ds

if ds>=length(everything) | dus>=length(everything)

distance=-1

end

Opportunities for recent engineering grads.

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

Start Hunting!
## 4 Comments

## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_687411

⋮## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_687411

## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_688931

⋮## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_688931

## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_688934

⋮## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_688934

## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_689079

⋮## Direct link to this comment

https://la.mathworks.com/matlabcentral/answers/445405-assignment-question-based-on-excel-file-i-o#comment_689079

Sign in to comment.