help-octave
[Top][All Lists]

## Re: Perform Gauss-broadening on line spectrum

 From: Maxim Gawrilow Subject: Re: Perform Gauss-broadening on line spectrum Date: Thu, 29 Aug 2019 12:32:49 +0200 User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0

```Hi,

```
thanks for your suggestion, looping wasn't that obvious for me. I now tried some different chunk sizes (funnily 50 is already the optimum), and in principle this works, but unfortunately Octave takes pretty much the same time as gnuplot: roughly 3 minutes for 500,000 entries.
```
With kind regards, Maxim

Am 28.08.19 um 16:08 schrieb Bård Skaflestad:
```
```Hi,

Did you already try the obvious way of reducing memory consumption--namely
processing parts of 'x' in a loop?  For instance such that each iteration
processes 50 or so x-values?

for k = 1:400
i = (k-1)*50 + (1:50);
outdata(i) = sum(gauss(x(i), inputdata(:,1), inputdata(:,2), 0.8), 1);
end

You would obviously need to make the magic constants 50 and 400 something
that's more adaptable, but this would be my first approach to reducing the
overall memory requirements.

Regards,

SINTEF Digital, Mathematics & Cybernetics
Computational Geosciences group

-----Original Message-----
Behalf Of Maxim Gawrilow
Sent: Wednesday, August 28, 2019 2:58 PM
Subject: Perform Gauss-broadening on line spectrum

Dear Octave users,

I have created a bunch of spectral lines and would like to simulate the
Gaussian broadened spectrum of these. The spectral lines are a Nx2 matrix where
the first column contains the position and the second the intensity of each
line. What I want is to place a Gaussian at each position, scale it with the
appropriate intensity and calculate the sum.
In theory, this code would do the job:

gauss = @(x,x0,Int,sigma)
Int./(sigma.*sqrt(2*pi)).*exp(-0.5*((x-x0)./sigma).^2);
x = linspace (0, 4000, 20000);
outdata = sum(gauss(x,inputdata(:,1),inputdata(:,2),0.8),1);
exportdata = [x', outdata'];

However, inputdata contains quite a few lines: at least half a million, sometimes even
several dozen million entries. Execution of said code results in "out of memory of
dimension too large for Octave's index type". Therefore I'd need a different
approach.
I am able to get the correct result in gnuplot with

plot "inputdata" smooth kdensity bandwidth 0.8

but this is extremely slow. Already for half a million entries it takes
5 minutes for a single plot, and will obviously take hours to compute cases
with dozens of millions of entries.

Does anyone have an idea of speeding up this process? I guess convolution with
a Gaussian would be a correct approach as well, but I didn't find any function
that suits my case (conv only takes equidistant vectors, and I'm a bit of a
loss at understanding kernel_density from econometrics).

With kind regards, Maxim

--
Maxim Gawrilow
Georg-August-Universität Göttingen
Institut für Physikalische Chemie
AG Suhm

Tammannstr. 6
37077 Göttingen

```
```
--
Maxim Gawrilow
Georg-August-Universität Göttingen
Institut für Physikalische Chemie
AG Suhm

Tammannstr. 6
37077 Göttingen

```