is it possible to expand [0 {9}, 45 {2}, 0 {9}]

6 views (last 30 days)
I have a matrix like [0 {9}, 45{2}, 0{9}] i want to expand it like
[0 0 0 0 0 0 0 0 0 45 45 0 0 0 0 0 0 0 0 0]? and it works like loop, [ 0{k}, 45{k}, 0{k}]
please help.
  2 Comments
Triveni
Triveni on 9 Aug 2016
Actually, I have to solve large number of data i am irritate to copy and paste it from lyx.
when i copy and paste this gives me [-45_{2}, 120, 90, 60, 120, 90, -45, 90, -45, 60, 90_{2}, 45, 120, 90, 120, 60, 30, 45, 120, 45, 90, 60, 30, 45, 30_{3}, 120, 60_{2}, 30] this type of format.

Sign in to comment.

Accepted Answer

Image Analyst
Image Analyst on 9 Aug 2016
If you're stuck starting with a string in that special format, then this code will parse it and produce the output vector
str = '[-45_{2}, 120, 90, 60, 120, 90, -45, 90, -45, 60, 90_{2}, 45, 120, 90, 120, 60, 30, 45, 120, 45, 90, 60, 30, 45, 30_{3}, 120, 60_{2}, 30]'
% Get rid of brackets
str(str== '[') = [];
str(str== ']') = [];
words = strsplit(str, ',')
output = [];
for k = 1 : length(words)
% See if there is a brace
thisWord = words{k}
braceLocation = strfind(thisWord, '{');
if isempty(braceLocation)
% There no brace there.
theNumber = str2double(thisWord);
theRepeat = 1;
else
% There is a brace there.
theNumber = str2double(thisWord(1:braceLocation-2));
theRepeat = str2double(thisWord(braceLocation+1:end-1));
end
fprintf('Repeat %d for %d times.\n', theNumber, theRepeat);
% Repeat this number the required number of times and append to the output.
output = [output, theNumber * ones(1, theRepeat)];
end
% Echo to command window:
output
  6 Comments
Triveni
Triveni on 10 Aug 2016
Thanks, between Some sequences don't have comma. I'll change it.

Sign in to comment.

More Answers (3)

Steven Lord
Steven Lord on 9 Aug 2016
If you write your problem slightly differently, you can use repelem.
v = repelem([0 45 0], [9 2 9])
  2 Comments
Triveni
Triveni on 9 Aug 2016
can i print ([0 45 0], [9 2 9]) to "[0 {9}, 45{2}, 0{9}]"

Sign in to comment.


Sean de Wolski
Sean de Wolski on 9 Aug 2016
This should do it:
str = '[0 {9}, 45{2}, 0{9}]';
expr = '(?<num>\d*)'; % match digits
nums = cellfun(@str2double,regexp(str,expr,'match')); % extract and convert
repelem(nums(1:2:end),nums(2:2:end)) % repelem
  2 Comments
Triveni
Triveni on 9 Aug 2016
Thanks, but unable to count negatives,
str = '[[0_{9}, 45_{2}, -45_{2}, 0_{7}]]';
expr = '(?<num>\d*)'; % match digits
nums = cellfun(@str2double,regexp(str,expr,'match'));
repelem(nums(1:2:end),nums(2:2:end)) % repelem

Sign in to comment.


Walter Roberson
Walter Roberson on 9 Aug 2016
Paste it into a string, and then you could use string processing. For example you could use regexprep with dynamic regular expressions and the ${} output replacement construct.

Products

Community Treasure Hunt

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

Start Hunting!

Translated by