how to horizontally concatenate two strings, being one a cell array and the other a num2str converted gpuarray?

Hello there, I am trying to concatenate two strings, but I'm missing something. The idea is to get these strings:
'CELL:0.1,CELLA:0.2,CHAR:0.3,GCH4:0.4,GH2:0.5'
'CELL:0.1,CELLA:0.3,CHAR:0.5,GCH4:0.7,GH2:0.9'
but my output is:
composition =
CELL:,CELLA:,CHAR:,GCH4:,GH2:0.1 0.2 0.3 0.4 0.5
composition =
CELL:,CELLA:,CHAR:,GCH4:,GH2:0.1 0.3 0.5 0.7 0.9
My code is below. Any help will be much appreciated. Thank you!
A1 = 0.1:0.1:0.5;
A2 = 0.1:0.2:1;
A1 = gpuArray(A1);
A2 = gpuArray(A2);
A = [A1;A2];
C = ['CELL:',',CELLA:',',CHAR:',',GCH4:',',GH2:'];
for i = 1:2
sp = sprintf('%s',C);
y_sp = sprintf('%s',num2str(A(i,:)));
composition = strcat(sp,y_sp);
display(composition);
end

 Accepted Answer

To whom it might concern I found the solution:
C = 'CELL:%.4f,CELLA:%.4f,CHAR:%.4f,GCH4:%.4f,GH2:%.4f';
for i = 1:2
composition{i} = sprintf(C,(A(i,1:a)));
composition{i} = num2str(composition{i});
end

2 Comments

Note that num2str does absolutely nothing here, and that line can be removed entirely from your code.
You could very easily make your code adjust automatically for different sizes of A and C, and to automatically generate the sprint format string as well:
A = [0.1:0.1:0.5;0.1:0.2:1]
C = {'CELL','CELLA','CHAR','GCH4','GH2'};
%
fmt = sprintf(',%s:%%.4f',C{:});
fmt = fmt(2:end);
N = size(A,1);
Z = cell(N,1);
for k = 1:N
Z{k} = sprintf(fmt,A(k,:));
end
Note how I preallocated the output cell array, which for a small array like this might not be strictly necessary, but is a good habit to learn.

Sign in to comment.

More Answers (2)

If you define C as a cell array instead then, for example, this should work:
C = { 'CELL:',',CELLA:',',CHAR:',',GCH4:',',GH2:' }
cell2mat( reshape( [C; arrayfun( @num2str, A1, 'UniformOutput', false )], [1 10] ) )
In a char array all your components just get merged into one long char that is much more complicated to extract the components from to concatenate each one with an element of A1

11 Comments

Hello Adam, thank you for your answer. I tried your solution, but it didn't work because of the GPUARRAY.
It gives me the following error:
Error using gpuArray/arrayfun The parameters 'UniformOutput' and 'ErrorHandler' are not supported when executing ARRAYFUN on a GPU.
I need it to work on GPUARRAY.
I hadn't even noticed the gpuArray, to be honest. Why are you using a gpuArray to do such a short calculation?
This is only a small test. My real situation is very similar to this one.
My current code takes more than 15 days to run and i'm trying desperately to speed it up.
Have you tried this without the gpuArrays? Getting gpu usage wrong can vastly slow down code also.
How do you have your data? Is it a text file?
If performance is that big of an issue, why use Matlab at all?
It's pretty, but fast it might not be sometimes.
doc profile
will also give you a good idea as to where the bottlenecks are. Code that takes 15 days to run is either very very sub-optimal or must be doing something spectacular or working on a truly vast amount of data!
@Adam, yes, my code works perfectly without the gpuarray. Im doing an optimization of several parameters (with cantera's library) using the genetic algorithm and patternsearch, that is why the code is so slow.
I tried to use lsqcurvefit, because it is faster, but didn't manage to make it work.
I have this solution, but somehow cantera does not recognize it as a string:
composition{i} = sprintf(C,(A(i,1:a)));
composition{i} = num2str(composition{i});
I will check doc profile. Thank you very much :)
@José-Luis, I chose matlab because im using the cantera's library to optimize several kinetic parameters... at the time i thought it was the best idea.
Speed can usually be improved a lot in Matlab, especially if you write your initial code with no particular care to being optimal (which I have done many times - get the code to do what you want first, then worry about speed!). It takes time and knowledge though and is always a trade-off between time spent optimising and time spent just letting the code run.
I have done plenty of optimisation work on algorithms of mine of late and have sometimes achieved speedups of x1000 by changing some seriously slow bits of code or redesigning how I store the data or access it etc. The profile is excellent at finding bottleneck points, but you need to ally it with knowledge of Matlab to come up with alternative ideas for these (or ask, of course). Generally nowadays I tend to have numerous ideas for alternative approaches to things, though sometimes they are all slower.
I also bought Yair Altman's book on Accelerating performance in Matlab though I am only ~100 pages into its > 700 pages so far!
That is fair enough. I like Matlab myself: Wouldn't be answering here otherwise.
If you want down to the metal performance, then it might not be the best choice. Because of this, C++ is my language of choice these days when I ---really--- need fast. Cost is also a problem: since University days, I haven't had an employer willing to shell out for all the toolboxes it'd be neat to have.
That's why, based on the kind of problem they have, I keep recommending people to look in other places as there are better (and possibly free) tools out there.
That being said, I do agree with you: slow code will be slow, be it in assembly or Matlab.
@ Adam, Thank you very much, I will check the book as well :)

Sign in to comment.

C = { 'CELL:','CELLA:','CHAR:','GCH4:','GH2:' }
S = string(C) + [.1:.1:.5;.1:.2:.9]
out = join(S,',');

2 Comments

The above requires R2016b or later.
With R2017a or later, the above could also be coded as
C = [ "CELL:", "CELLA:", "CHAR:", "GCH4:','GH2:" ];
S = C + [.1:.1:.5;.1:.2:.9]
out = join(S,',');
Unfortunately both version of this will fail when the numeric array is a gpuArray :(
Yes, it is true.. i tried it :\. Thank you very much for your answer

Sign in to comment.

Categories

Asked:

on 21 Aug 2017

Edited:

on 24 Aug 2017

Community Treasure Hunt

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

Start Hunting!