This segments the monotonically increasing part of each pulse, as depicted in the 2nd image in my comment under your question.  See inline comments for details.  
Input:  signal (provided by your mat file)
Output: startIdx (the starting index of each rise), locs (the index of the peaks).
 Method 1
This method is not recommended; see method 2 below. 
signalSmooth = smooth(signal,20); 
[~, locs] = findpeaks(signalSmooth, 'MinPeakHeight', range(signal)*.4 + min(signal), 'MinPeakDistance', 200); 
mm = movmean([inf;diff(signal)] > 0, [0,3]) == 1;
mmIdx = find(mm); 
firstOnes  = find([mm(1);diff(mmIdx)>1]);
startIdx = mmIdx(firstOnes); 
clf()
plot(signal, 'b-')
hold on
plot(locs, signal(locs), 'r*')
plot(startIdx, signal(startIdx), 'mx', 'LineWidth',2)
segements = arrayfun(@(start,stop){signal(start:stop)},startIdx,locs); 
figure()
hold on
cellfun(@(c)plot(c),segements)
Or, if you want to preserve the x-values, 
segements = arrayfun(@(start,stop){signal(start:stop)},startIdx,locs); 
segement_xvalues = arrayfun(@(start,stop){start:stop},startIdx,locs); 
figure()
hold on
cellfun(@(x,y)plot(x,y),segement_xvalues, segements)
Update: Method 2
New smoothing method; a new, more robust, method of finding the start of each rising segment that ends at a peak. 
load('signal3.mat'); 
signal = s3; 
signalSmooth = smoothdata(signal,'gaussian', 20);
[~, locs] = findpeaks(signalSmooth, 'MinPeakHeight', range(signal)*.1 + min(signal), 'MinPeakDistance', 200); 
isIncrease = diff([inf; signalSmooth]) > 0 ;
notIncrIdx = find(~isIncrease); 
idx = notIncrIdx(:) < locs(:).'; 
startIdx = arrayfun(@(col)find(idx(:,col),1,'last'),1:numel(locs)); 
startIdx = notIncrIdx(startIdx)+1; 
clf()
plot(signal, 'b-')
hold on
plot(locs, signal(locs), 'r*')
plot(startIdx, signal(startIdx), 'mx', 'LineWidth',2)
segements = arrayfun(@(start,stop){signal(start:stop)},startIdx,locs); 
segement_xvalues = arrayfun(@(start,stop){start:stop},startIdx,locs); 
figure()
hold on
cellfun(@(x,y)plot(x,y),segement_xvalues, segements)