# 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('Seattle, WA'

62 visualizzazioni (ultimi 30 giorni)
Abhishek singh il 17 Apr 2019
Risposto: Pascal il 15 Giu 2023
function distance = get_distance(x,y)
col_labels = raw(1,:);
row_labels = raw(:,1);
try
distance = raw{contains(row_labels,y),contains(col_labels,x)};
catch
distance = -1;
end
end
error
Assessment result: incorrectNashville, TN and Las Vegas, NV
Variable distance has an incorrect value.
Assessment result: incorrectRandom city pairs
Variable distance has an incorrect value.
get_distance('Chattanooga, TN','Meads, KY') returned -1 which is incorrect.
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

### Risposte (22)

Arafat Roney il 6 Mag 2020
function distance=get_distance(a,b)
row=raw(1,:);
col=raw(:,1);
for ii=2:length(row)
if strcmp(row(ii),a)
mii=ii;
break;
end
end
for jj=2:length(col)
if strcmp(col(jj),b)
njj=jj;
break;
end
end
if (strcmp(row(ii),a))&&(strcmp(col(jj),b))
distance=raw{mii,njj};
else
distance=-1;
end
end
##### 6 CommentiMostra 5 commenti meno recentiNascondi 5 commenti meno recenti
Walter Roberson il 20 Ago 2021

Accedi per commentare.

Mati Somp il 6 Ott 2020
one more
function distance = get_distance(A,B)
ii=0;
jj=0;
for i=2:length(data)
if string(A)==string(txt{1,i})
ii=i;
end
if (string(B)==string(txt{1,i}))
jj=i;
end
end
if (~(jj) || ~(ii))
distance=-1;
else
distance=data(ii-1,jj-1);
end
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Kulko Margarita il 12 Feb 2021
I wish this code was commented. I understand the general idea, but would like to see the logic flow of whoever wrote it.

Accedi per commentare.

Olel Arem il 1 Mag 2020
Modificato: Olel Arem il 1 Mag 2020
function distance=get_distance(city_1,city_2)
n=0;m=0;
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
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Rik il 16 Mar 2022
That will never be true. n can't be 0 and 1 at the same time. Why this uncommented block of code ever received an upvote is not clear to me.

Accedi per commentare.

Taif Ahmed BIpul il 28 Mag 2020
function distance=get_distance(A,B)
p=strcmp(All,A);
q=strcmp(All,B);
r=sum(p(:));
s=sum(q(:));
if ~(r==2&&s==2)
distance=-1;
return
end
a=find(p==1);
b=find(q==1);
distance=All{(a(1)),(b(1))};
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Walter Roberson il 20 Lug 2020
The ==2 does not make sense to me; it would make sense to me if it were ==1 meaning that exactly one column matched.
Oh wait... the Raw (third) output has the names in the first row and in the first column. The person who wrote the above code assumes that each name will appear exactly once in the header row and once in the header column, for a total of two appearances: that is why the 2. The person also assumes that the order is exactly the same between the rows and columns.
Distance matrices should not be assumed to be symmetric. I would not recommend this version of the code.

Accedi per commentare.

UJJWAL Padha il 11 Giu 2020
function distance = get_distance(x,y)
k=-1;
[r c] = size(all)
for i = 1:r
for j = 1:c
if i==1 && j==1
continue;
else
if strcmp(x,all(i,1))==1 && strcmp(y,all(1,j))==1
k= all{i,j};
end
end
end
end
distance = k;
end
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Rik il 1 Set 2020
It turns out you can't reliably cheat off this page, because some solutions have bugs or flaws. If that weren't the case I would probably be a lot more active in deleting answers.

Accedi per commentare.

Ankit singh chauhan il 29 Nov 2020
Modificato: Rik il 29 Nov 2020
g=strcmp(raw,city1)
[r1,c1]=find(s==1)
[r2,c2]=find(g==2)
distance=raw{r1,r2}
catch
distance=-1
end
##### 1 CommentoMostra NessunoNascondi Nessuno
Rik il 29 Nov 2020
Still the same question: why did you post this? What does it teach?

Accedi per commentare.

Gokul surya Subramanian il 17 Apr 2019
Modificato: Rik il 2 Lug 2019
function distance = get_distance(a,b)
for i=2:size(raw,1)
if strcmp(text{i,1}, a)
break
end
end
if i>=size(raw,1)
distance=-1;
else
for j=2:size(raw,2)
if strcmp(text{1,j}, b)
distance=raw{i,j};
break
end
end
if j>=size(raw,2)
distance = -1;
end
end
##### 13 CommentiMostra 12 commenti meno recentiNascondi 12 commenti meno recenti
Walter Roberson il 17 Feb 2021
For this particular homework problem, the reference data has been defined to be stored in a xlsx file that has the format
<empty> <cityname1> <cityname2> <cityname3> ...
<cityname1> distance11 distance12 distance13 ...
<cityname2> distance21 distance22 distance23 ...
where the <cityname> are text such as 'Los Vegas, Nevada' and 'Wawa, Ontario', and the distances are numeric.
When you use xlsread on the file and ask for the second output, the output will be a cell array of character vectors, with the character vectors being present where the original data had text, and being empty where the original data had numbers. So it might look something like
txt = {
[], 'LA', 'Wawa', 'Lima'
'LA' [] [] []
'Wawa' [] [] []
'Lima' [] [] []
}
When you use txt{1,i} you would therefore be accessing the [] at the beginning, or one of the city names, 'LA', 'Wawa', 'Lima' -- you would be reading out of row #1 from the txt cell array. txt{ROWNUMBER, COLUMNNUMBER} is the general form.
Using string() on a character vector converts it from being a character vector to being a scalar "string" object. So the line
if string(A)==string(txt{1,i})
converts character vector inside A to a string() object; and then extracts the content of column #i from row 1 of the cell array named txt and converts that content into a string() object. Then the line uses == between the string objects.
The reason someone would do that is that == is defined between string objects to return true of the strings have the same content, and false if the strings do not have the same content, with false being returned if they are different because they have different lengths. So string('LA') == string('Wawa') is perfectly good code that will not have a problem.
But == is not defined between character vectors in the same way, In particular, == between character vectors will fail if they both have more than one character and the lengths do not match. 'LA'=='Wawa' would fail complaining that the array dimensions do not agree (meaning that the lengths are different.) To compare character vectors taking into account they might be different lengths, use strcmp(), as in strcmp('LA', 'Wawa')

Accedi per commentare.

function distance = get_distance(a,b)
for i=2:size(raw,1)
if strcmp(text{i,1}, a)
break
end
end
if i>=size(raw,1)
distance=-1;
else
for j=2:size(raw,2)
if strcmp(text{1,j}, b)
distance=raw{i,j};
break
end
end
if j>=size(raw,2)
distance = -1;
end
end
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Alan Chacko il 13 Mag 2020
function d = get_distance(c1,c2)
[r,c] = size(city);
row = city(1:end,1);
col = city(1,1:end);
ccr=sort(contains(row(2:end),c1));
ccc=sort(contains(col(2:end),c2));
if ccr'==ccc
ir = find(strcmp(row,c1));
ic = find(strcmp(col,c2));
d = city{ir,ic};
else
d=-1;
end
##### 5 CommentiMostra 4 commenti meno recentiNascondi 4 commenti meno recenti
Walter Roberson il 31 Mag 2020
What happens when you use the debugger to trace the flow of your code?

Accedi per commentare.

Timothy Simon Thomas il 21 Mag 2020
function distance=get_distance(L1,L2)
i=1;j=1;
[R C]=size(n);
while(~(strcmp(L1,r(1,i))) && i<=R)
i=i+1;
end
while(~(strcmp(L2,r(j,1)))&& j<=C)
j=j+1;
end
j=j-1;i=i-1;
if(~(strcmp(L1,r(1,i+1))) || ~(strcmp(L2,r(j+1,1))))
distance=-1;
else
distance=n(i,j);
end
end
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Ujjawal Barnwal il 7 Giu 2020
function distance=get_distance(c1,c2)
a=0;b=0;
for ii=2:337
if strcmp(txt{1,ii},c1)
a=ii;
elseif strcmp(txt{1,ii},c2)
b=ii;
end
end
if a && b
distance=num(a-1,b-1);
else
distance=-1;
end
##### 1 CommentoMostra NessunoNascondi Nessuno
Walter Roberson il 7 Giu 2020
Why 337?
Your code assumes that Distances contains data of a particular size. It also assumes that the number of rows and columns is the same. It further assumes that there is never a case where the two different cities happen to occur at the same row and column number. For example,
* apple orange grapefruit
orange 2 0 3
grapefruit 1 3 0
apple 0 2 1
Your code would fail for (say) orange, grapefruit because it assumes that when it finds orange in column 3, that it is not possible to also happen to find grapefruit in row 3.

Accedi per commentare.

Vishesh Haria il 7 Giu 2020
function distance=get_distance(a,b)
row=raw(1,:);
col=raw(:,1);
for ii=2:length(row)
if strcmp(row(ii),a)
mii=ii;
break;
end
end
for jj=2:length(col)
if strcmp(col(jj),b)
njj=jj;
break;
end
end
if(njj > 0 && mii > 0)
distance = raw{mii,njj};
elseif(njj == 1 && mii == 1)
distance = -1;
elseif(njj == 0 && mii == 0)
distance = -1;
else
distance=-1;
end
end
Error:
distance = get_distance('g, WA','Miagmi, FL')
Unrecognized function or variable 'njj'.
Error in get_distance (line 19)
if(njj > 0 && mii > 0)
Help me understand this error.
##### 1 CommentoMostra NessunoNascondi Nessuno

I think you might remove two elif condition commands and set default "mii" and "njj" as 0, then it could work.

Accedi per commentare.

Md Nazmus Sakib il 20 Giu 2020
function y = get_distance(city_1,city_2)
global raw;
%fetching cities in rows
r_city = {};
for i = 1:337
r_city{1,i} = raw{1,i};
end
%fetching cities in columns
c_city = {};
for j = 1:337
c_city{1,j} = raw{j,1};
end
%searching city_1
search_c1 = strcmp(c_city,city_1);
%searching row
for ii = 1:337
if (search_c1(1,ii) == 1)
break
else
ii = 1;%if the city is not found ii will give 1
end
end
%searching city_2
search_c2 = strcmp(r_city,city_2);
%searching column
for jj = 1:337
if (search_c2(1,jj) == 1)
break
else
jj = 1;%if the city is not found jj will give 1
end
end
if ((ii == 1) || (jj == 1)) % if the city is not found
y = -1;
else
y = raw{ii,jj}(1,1);
end
end
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Md Nazmus Sakib il 21 Giu 2020
Thanks, I think I'll first measure the size or length of 'raw'.

Accedi per commentare.

M NAGA JAYANTH AVADHANI il 28 Lug 2020
Modificato: M NAGA JAYANTH AVADHANI il 28 Lug 2020
This works perfectly.
function distance = get_distance(city1,city2)
row = raw(1,:);
col = raw(:,1);
mi =0;mj =0;
for i = 2:length(row)
if strcmp(row(i),city1)
mi = i;
end
end
for j = 2:length(col)
if strcmp(col(j),city2)
mj = j;
end
end
if mi> 1 && mj>1
distance = raw{mi,mj};
else
distance = -1;
end
end
##### 3 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
thanks sir

Accedi per commentare.

Capulus_love il 12 Ago 2020
Modificato: Capulus_love il 12 Ago 2020
function distance = get_distance(a,b)
col = excel(1,:);
row = excel(:,1);
x=size(col)
y=size(row)
col_count = 1;
row_count = 1;
for i = 2 : x(2)+1
col_count = col_count + 1;
if contains(col{i},a) == 1
break
end
end
for j = 2 : y(1)+1
row_count = row_count + 1;
if contains(row{j},b) == 1
break
end
end
if (col_count > 337) || (row_count > 337)
distance = -1
else
distance = excel{row_count,col_count}
end
end
% why Non-existent city is not solved...???
##### 3 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
Walter Roberson il 12 Ago 2020
if (col_count > 337) || (row_count > 337)
What would happen if they changed the data file to one that had (for example) 500 cities?

Accedi per commentare.

Yan Li il 4 Set 2020
function distance = get_distance (ct1, ct2)
f_row = raw(1,:);
f_col = raw(:,1);
flag = false;
distance = -1;
for n=1:length(f_row)
for m=1:length(f_col)
if string(f_row(n)) == ct1 && string(f_col(m)) == ct2
flag = true
distance = raw{n,m};
end
end
end
end
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Rik il 4 Set 2020
Surprisingly enough this works.
string({'foo'})=='foo'
Why did you decide to post this? What does it teach?
Also, why are you setting a flag, but not returning it or using it anywhere?

Accedi per commentare.

Ahmed Saleh il 28 Mar 2021
Modificato: Ahmed Saleh il 28 Mar 2021
function distance = get_distance(city1,city2)
num1=0;
num2=0;
s=size(distances);
for i=2:s(1)
logic=strcmp(city1,distances{i,1});
if logic== true
num1=i;
break
end
end
for j=2:s(2)
logic2 = strcmp(city2,distances{1,j});
if logic2 == true
num2=j;
break
end
end
if num1==0 || num2==0
distance=-1;
return
end
distance=distances{num1,num2};
end
##### 7 CommentiMostra 6 commenti meno recentiNascondi 6 commenti meno recenti
Ahmed Saleh il 30 Mar 2021
ok, thank you

Accedi per commentare.

Abhijeet Singh il 14 Mag 2021
Modificato: Abhijeet Singh il 14 Mag 2021
function distance = get_distance(x,y)
a = everything(1:size(everything,1),1);
b = everything(1,1:size(everything,2));
for j = 1:size(everything,1)
l=0;
if strcmp(a(j,1),x)
l=j;
break
end
end
for i = 1:size(everything,2)
k=0;
if strcmp( b(1,i),y)
k=i;
break
end
end
if k ~= 0 && l ~= 0
s = everything(l,k);
distance = s{1};
else
distance = -1;
end
end
##### 3 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
Rik il 15 Mag 2021
What would you say is the key difference between your solution and the one above this one?
If you want to educate: comments are a great way to explain what your code is doing.
Also:
a = everything(1:size(everything,1),1);
b = everything(1,1:size(everything,2));
%is equivalent to this:
a = everything(:,1);
b = everything(1,:);

Accedi per commentare.

Silvana Castillo il 3 Giu 2021
function distance = get_distance(c1,c2);
% reads excel file in just everything
% find would give index of c1 readinf first column
a = find(strcmp(everything(1,1:end),c1))
% find would give index of c2 reading first row
% strcmp = are equals two strings inputs?
b = find(strcmp(everything(1:end,1),c2))
% if any c1 or c2 do not exist
if isempty(a) || isempty(b)
distance = -1
else
% converts from cell class to matrix or double
%the distance value based on index
distance = cell2mat(everything(a,b))
end
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Milad Mehrnia il 31 Ott 2021
function distance = get_distance(a,b)
x = 0;y = 0;
for i = 2:lenghth(txt)
if strcmp(txt{1,i},a)
x = i;break; % It's better to use break, Because it reduces the running time significantly
end
end
for j = 2:height(txt) % It's better to use a seperated for function for j, Because it reduces the running time significantly too
if strcmp(txt{j,1},b)
y = j;break;
end
end
if ~x || ~y
distance = -1;
else
distance = num(x-1,y-1);
end
##### 2 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Milad Mehrnia il 1 Nov 2021
As we have the matrices on the memory, you are right and ismember is better than for. After your comment I tried it and the result is awesome. It brakes the time to half.
Really thank you

Accedi per commentare.

Zia Ur Rehman il 30 Ago 2022
Hi folks,
plz check my code and plz tell me if I can improve this.
function distance = get_distance(a,b)
[~, ~, data] = xlsread('Distances.xlsx'); %reading the file and having its full data that is by default raw data in data variable on 3rd aurgument
z = size(data); % Calculating the size as we need to traverse both first coloumn and first row
c = z(1,1); % c = no. of rows
d = z(1,2); % d = no. of coloumn
for i = 2:c % as (1,1) of file is empty so starting from 2 to the length of rows and coloumns
e = strcmp(data{1,i},a); % checking through first row and compare with a
if e == true % if we find the matching then record its index in f and stop the loop through 'break'.
f = i;
break;
end
end
for j = 2:d
k = strcmp(data{j,1},b); % checking through first coloumn and compare with b
if k == true % if we find the matching then record its index in l and stop the loop through 'break'.
l = j;
break;
end
end
if e==true && k==true % if both are true then show the distance at that index(f,l) otherwisr distance = -1
distance = data{f,l};
else
distance = -1;
end
##### 4 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Zia Ur Rehman il 30 Ago 2022
ok, I will check how this builtin function works.

Accedi per commentare.

Pascal il 15 Giu 2023
I got this solution but the last bit of code seems rather plump, do you have suggestions to improve the code?
function [distance] = get_distance(c1,c2)
row1 = raw(1,2:end);
col1 = raw(2:end,1);
ind1 = find(ismember(row1,c1));
ind2 = find(ismember(col1,c2));
if isempty(ind1) || isempty(ind2)
distance = -1;
else
dis = raw(2:end,2:end);
d = dis(ind1,ind2);
distance = cell2mat(d);
end
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

### Categorie

Scopri di più su Data Type Conversion in Help Center e File Exchange

R2016b

### Community Treasure Hunt

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

Start Hunting!