Info

This question is locked. 編集または回答するには再度開いてください。

Assignment question based on excel file I/O

6 ビュー (過去 30 日間)
Ajai Kannan
Ajai Kannan 2019 年 2 月 17 日
Locked: Rik 2024 年 7 月 9 日
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.
download.png
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
  4 件のコメント
Guillaume
Guillaume 2019 年 4 月 2 日
@sanket,
Loops are not needed at all for this. strcmp is perfectly capable of the searching a whole cell array at once.
Walter Roberson
Walter Roberson 2019 年 4 月 2 日
This code is wrong for the case where the match is the last row or column. You break out of the loop but the value of the index happens to exactly equal to the size so you think there was no match.

回答 (7 件)

Olel Arem
Olel Arem 2020 年 5 月 1 日
編集済み: Olel Arem 2020 年 5 月 1 日
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

Geoff Hayes
Geoff Hayes 2019 年 2 月 17 日
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).
  4 件のコメント
Priyamvada Shankar
Priyamvada Shankar 2019 年 3 月 23 日
Ajai Kannan if you got the correct code.. please post here
Walter Roberson
Walter Roberson 2019 年 3 月 23 日
This is obviously an assignment. We seldom post the code to answer assignments. However, if you post your attempt and indicate the error messages you are encountering, then we will assist you in debugging what you have.

ABINAND PANDIYAN
ABINAND PANDIYAN 2020 年 4 月 24 日
編集済み: ABINAND PANDIYAN 2020 年 4 月 25 日
% 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
  2 件のコメント
Walter Roberson
Walter Roberson 2020 年 4 月 24 日
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
ABINAND PANDIYAN 2020 年 4 月 25 日
編集済み: ABINAND PANDIYAN 2020 年 4 月 25 日
@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.

Fazlul Haque
Fazlul Haque 2020 年 5 月 15 日
done without using loops
  8 件のコメント
Farhaan Zaidi Bhat
Farhaan Zaidi Bhat 2020 年 12 月 13 日
編集済み: Farhaan Zaidi Bhat 2020 年 12 月 13 日
Can you please explain the a and b steps? The data part?
Rik
Rik 2020 年 12 月 13 日
Did you read the documentation for the strcmpi function?

Muhammad Qaisar Ali
Muhammad Qaisar Ali 2020 年 6 月 27 日
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
  2 件のコメント
Walter Roberson
Walter Roberson 2020 年 6 月 27 日
Caching the data is often a good performance improvement, but remember to document the method that would need to be used to signal that the Distances file had changed.
Muhammad Qaisar Ali
Muhammad Qaisar Ali 2020 年 6 月 28 日
Thanks for your vaulable feedbak..indeed it helps me alot..

Priyamvada Shankar
Priyamvada Shankar 2019 年 3 月 22 日
Can you please write the code...it will be a great help... please I have tried too many times but still getting some problems
  7 件のコメント
Walter Roberson
Walter Roberson 2019 年 3 月 29 日
You want to find some way to break out of the loop early.
sadek kouz
sadek kouz 2020 年 3 月 18 日
編集済み: sadek kouz 2020 年 3 月 18 日
use break to break out of the looo

XINYI CAI
XINYI CAI 2021 年 3 月 16 日
why my answer does not work for non-exsitent city?
  3 件のコメント
XINYI CAI
XINYI CAI 2021 年 3 月 16 日
@Rikoh i see, variables row and column are arrays with a number of 0 instead of empty arrays, I should change column=value1==1 to coulmn=find(value1==1) and the same for variable row, then it makes sense. tq
Rik
Rik 2021 年 3 月 16 日
No, you should use ~any(row) instead.

This question is locked.

カテゴリ

Help Center および File ExchangeAnnotations についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by