Sprintf Matlab with Apostrophe - matlab

I have a string listed below with apostrophe.
stringVar = '''L''hopital''s rule'''
when I do sprintf i.e. sprintf(stringVar) it prints this 'L'hopital's rule'.
Now, what I would like to do is do an sprintf so that when I print it it will display as
'L''hopital''s rule'
Now I know I can easily do this '''L''''hopital''''s rule''' but would prefer to do it programatically. What's the best/correct way of approaching this problem. Note: I will need to handle many of these e.g. '''L''Environment'''.

ind = regexp(stringVar, '\w''\w') + 1; %// detect quotes between word characters
stringVarRep = stringVar(sort([1:numel(stringVar) ind])); %// repeat those quotes

Related

Matlab export_fig: set variable file name as a string and not a number

I want to have the option at the beginning of my script to set whether I want to export the figure or not, and to set the name of the exported figure:
EXPORT_FIGURE = 1;
FIGURE_NAME = 'some_string';
...
if EXPORT_FIGURE == 1
export_fig(sprintf('%d', FIGURE_NAME), '-png', '-q101');
end
This works fine when FIGURE_NAME is a number, but not when I set it as a string. Is there a way around this? If I can use a string, then I can just name the figure at the top of my script.
The issue is because you used the '%d' format specifier which is for numbers. You will need to use '%s' for a string.
if ischar(FIGURE_NAME)
filename = sprintf('%s', FIGURE_NAME);
else
filename = sprintf('%d', FIGURE_NAME);
end
export_fig(filename, '-png', '-q101')
The use of sprintf and %d wants to turn the FIGURE_NAME into an integer, this works if FIGURE_NAME is numeric, not if it is a string. The problem is therefore not the export_fig function, but the sprintf function.

Extract values from filenames

I have file names stored as follows:
>> allFiles.name
ans =
k-120_knt-500_threshold-0.3_percent-34.57.csv
ans =
k-216_knt-22625_threshold-0.3_percent-33.33.csv
I wish to extract the 4 values from them and store in a cell.
data={};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
data{k,2}= %kvalue
data{k,3}= %kntvalue
data{k,4}=%threshold
data{k,5}=%percent
...
end
There's probably a regular expression that can be used to do this, but a simple piece of code would be
data={numel(allFiles),5};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
[~,name] = fileparts(allFiles(k).name);
dashIdx = strfind(name,'-'); % find location of dashes
usIdx = strfind(name,'_'); % find location of underscores
data{k,2}= str2double(name(dashIdx(1)+1:usIdx(1)-1)); %kvalue
data{k,3}= str2double(name(dashIdx(2)+1:usIdx(2)-1)); %kntvalue
data{k,4}= str2double(name(dashIdx(3)+1:usIdx(3)-1)); %threshold
data{k,5}= str2double(name(dashIdx(4)+1:end)); %percent
...
end
For efficiency, you might consider using a single matrix to store all the numeric data, and/or a structure (so that you can access the data by name rather than index).
You simply need to tokenize using strtok multiple times (there is more than 1 way to solve this). Someone has a handy matlab script somewhere on the web to tokenize strings into a cell array.
(1) Starting with:
filename = 'k-216_knt-22625_threshold-0.3_percent-33.33.csv'
Use strfind to prune out the extension
r = strfind(filename, '.csv')
filenameWithoutExtension = filename(1:r-1)
This leaves us with:
'k-216_knt-22625_threshold-0.3_percent-33.33'
(2) Then tokenize this:
'k-216_knt-22625_threshold-0.3_percent-33.33'
using '_' . You get the tokens:
'k-216'
'knt-22625'
'threshold-0.3'
'percent-33.33'
(3) Lastly, for each string, tokenize using using '-'. Each second string will be:
'216'
'22625'
'0.3'
'33.33'
And use str2num to convert.
Strategy: strsplit() + str2num().
data={};
for k =1:numel(allFiles)
data{k,1}=csvread(allFiles(k).name,1,0);
words = strsplit( allFiles(k).name(1:(end-4)), '_' );
data{k,2} = str2num(words{1}(2:end));
data{k,3} = str2num(words{2}(4:end));
data{k,4} = str2num(words{3}(10:end));
data{k,5} = str2num(words{4}(8:end));
end

how can I load file.txt in matlab?

I have a folder contained several files in it
loc1.txt loc2.txt .... loc10.txt
I want to use them in matlab this is my code :
for i=1:10
myFile =['E:\dis\locs\loc' i '.txt'];
b= importdata(myFile);
but it does not work and output is like this :
'E:\dis\locs\loc .txt'
is there any body help me here?
You need to convert i into characters.
myFile =['E:\dis\locs\loc' num2str(i) '.txt'];
Nemesis' answer using num2str is correct. Another possibility is to use sprintf:
myFile = sprintf('E:\dis\locs\loc%d.txt', i);
The interface is less intuitive if you have never seen it before but it is also very convenient when you have zero-padded numbers, like loc0001.txt, loc0002.txt, etc. In this case just replace %d by %04d like this:
myFile = sprintf('E:\dis\locs\loc%04d.txt', i);

How to add \ before all special characters in MATLAB?

I am trying to add '\' before all special characters in a string in MATLAB, could anyone please help me out. Here is the example:
tStr = 'Hi, I'm a Big (Not So Big) MATLAB addict; Since my school days!';
I want this string to be changed to:
'Hi\, I\'m a Big \(Not so Big \) MATLAB addict\; Since my school days\!'
The escape character in Matlab is the single quote ('), not the backslash (\), like in C language. Thus, your string must be like this:
tStr = 'Hi\, I\''m a Big (Not so Big ) MATLAB addict\; Since my school days!'
I took the list of special charecters defined on the Mathworks webpage to do this:
special = '[]{}()=''.().....,;:%%{%}!#';
tStr = 'Hi, I''m a Big (Not So Big) MATLAB addict; Since my school days!';
outStr = '';
for l = tStr
if (length(find(special == l)) > 0)
outStr = [outStr, '\', l];
else
outStr = [outStr, l];
end
end
which will automatically add those \s. You do need to use two single quotes ('') in place of the apostrophe in your input string. If tStr is obtained with the function input(), or something similar, this will procedure will still work.
Edited:
Or using regular expressions:
regexprep(tStr,'([[\]{}()=''.(),;:%%{%}!#])','\\$1')

How to convert a numeric variable to a string in MATLAB

A=rand(10)
B=find(A>98)
How do you have text saying "There were 2 elements found" where the 2 is general i.e. it isn't text, so that if I changed B=find(A>90) it would automatically no longer be 2.
some_number = 2;
text_to_display = sprintf('There were %d elements found',some_number);
disp(text_to_display);
Also, if you wanted to count the number of elements greater than 98 in A, you should one of the following:
numel(find(A>98));
Or
sum(A>98);
sprintf is a very elegant way to display such data and it's quite easy for a person with a C/C++ background to start using it. If you're not comfortable with the format-specifier syntax (check out the link) then you can use:
text_to_display = ['There were ' num2str(some_number) ' elements found'];
But I would recommend sprintf :)