how to replace char in array with a double
조회 수: 24 (최근 30일)
이전 댓글 표시
I am making a program that converts Roman numerals to numerical values. My current code is below.
%%Roman Numeral Conversion
%Declare variables
I=1;
V=5;
X=10;
L=50;
C=100;
D=500;
M=1000;
%input Roman numeral
Roman=input('Roman numeral: ','s')
letters=cellstr(Roman')'
for n=1:length(letters)
if (strcmp(letters(n),'I'))||(strcmp(letters(n),'i'))
letters(n)=1;
elseif (strcmp(letters(n),'V'))||(strcmp(letters(n),'v'))
letters(n)=5;
elseif (strcmp(letters(n),'X'))||(strcmp(letters(n),'x'))
letters(n)=10;
elseif (strcmp(letters(n),'L'))||(strcmp(letters(n),'l'))
letters(n)=50;
elseif (strcmp(letters(n),'C'))||(strcmp(letters(n),'c'))
letters(n)=100;
elseif (strcmp(letters(n),'D'))||(strcmp(letters(n),'d'))
letters(n)=500;
elseif (strcmp(letters(n),'M'))||(strcmp(letters(n),'m'))
letters(n)=1000;
else disp('Not valid entries')
break
end
end
number=sum(letters)
text=sprintf(Roman,'= %d',number)
disp(text)
When I run this, I get the error below when I try to substitute the letter for its corresponding numerical value.
Conversion to cell from double is not possible.
Error in Roman_Numeral_Conversion (line 21)
letters(n)=10;
How can I avoid this problem?
댓글 수: 1
Stephen23
2025년 7월 20일
Note that you can replace two STRCMP calls:
strcmp(letters(n),'V'))||strcmp(letters(n),'v')
with one STRCMPI call:
strcmpi(letters(n),'V')
채택된 답변
James Tursa
2016년 8월 9일
You made a cell array with this line:
letters = cellstr(Roman')'
That is why you are getting the conversion error. Make it a double instead. E.g.,
letters = zeros(size(Roman));
Then in your loop, compare with Roman instead of letters. E.g.,
if (strcmp(Roman(n),'I'))||(strcmp(Roman(n),'i'))
letters(n)=1;
elseif (strcmp(Roman(n),'V'))||(strcmp(Roman(n),'v'))
letters(n)=5;
:
etc
However, this is just a character conversion code. You still need to put in logic for when values are added vs subtracted. E.g., your code will give an answer of 11 for 'XI' as well as 'IX' when the latter should be 9.
추가 답변 (1개)
Steven Lord
2025년 7월 20일
이동: Stephen23
2025년 7월 21일
Another way to do this would be to set up a vector and use indexing. Let's try it with a valid and an invalid Roman numeral string.
decode('MCMLXXXVI')
decode('DIMS')
function arabic = decode(roman)
values = NaN(1, double('z'));
values('ivxlcdm') = [1, 5, 10, 50, 100, 500, 1000];
roman = char(roman);
arabic = NaN(size(roman));
arabic = values(lower(roman));
if anynan(arabic)
error("Roman numeral string '" + roman + "' contained invalid characters")
end
end
댓글 수: 1
Stephen23
2025년 7월 21일
편집: Stephen23
2025년 7월 21일
+1
The second NaN preallocation can be skipped, the indexing itself will generate the same vector:
decode('MCMLXXXVI')
decode('DIMS')
function vec = decode(roman)
map = NaN(1,+'Z');
map('IVXLCDM') = [1,5,10,50,100,500,1000];
vec = map(roman);
assert(~anynan(vec),'Roman numeral string contained invalid characters')
end
참고 항목
카테고리
Help Center 및 File Exchange에서 Argument Definitions에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!