MATLAB Answers

How do I align two vectors similar to that done in plot?

21 views (last 30 days)
I have two sets of corresponding vectors that I want to compare. The first set of vectors contain pixel intensity values for every frame Int(F), and the second set contain wavelengths of light (wvLngth(F)). From these vectors I want to produce a third vector that is pixel intensity in terms of wavelength Int(wvLngth). The problem is that vectors containing the wavelengths do not start and end at the same wavelength, nor do the wavelengths increase at the same rate.
For example:
int1Data = [1 2 3 4];
int2Data = [5 6 7 8];
wvLngth1Data = [7 9 10 11];
wvLngth2Data = [9 10 11 13];
%I can plot these two together to align them but how can I add them in the way they are plotted?
figure
plot(wvLngth1Data, int1Data);
hold on
plot(wvLngth2Data, int2Data);
%I'd like to produce something like:
intAvg = [1 3.5 4.5 5.5 8]
wvLngthComb = [7 9 10 11 13]
figure
plot(wvLngthComb, intAvg);
I've looked at things to align or interpolate the data, but I don't think I can align my data set just at the start, because the middle or end would be wrong, and I don't need Matlab to interperet what it things the missing points should be either.
Thanks in advance.
  2 Comments
Jason Powell
Jason Powell on 11 Jun 2019
By "int(F)" I mean to say: for frame x the intensity is y. So the relation I have (and I recognize is a stretch) is that the first element of all the vectors belongs to the same image, and the second to the second image, ect..
Regardless of the lack of a relationship; however, when I call plot on both sets of data, Matlab is able to align them (atleast visually) so I can see both sets of data on the same cordinate system. I'm wondering if it is somehow possible use that visual alignment mathmatically?
I suppose I could make a unique vector for each element in my data set containing every single possible wavelength, and then populate that vector with the data that I do have for each element, but I'm hoping there is a more clever/ built in way that I could call upon.
Thanks

Sign in to comment.

Accepted Answer

James Browne
James Browne on 12 Jun 2019
Greetings,
I think I understand what you are after. I used your example data and wrote a script that creates a list of unique wavelength values from both wavelength data vectors, determines the average pixel intensity for each wavelength, assembles the averages in a vector which corrosponds to the vector of unique wavelength values and then plots the result. It would take quite some work to rework the code if you have more than two sets of intensity/wavelength data but it is certainly doable.
Here is what I came up with:
int1Data = [1 2 3 4];
int2Data = [5 6 7 8];
wvLngth1Data = [7 9 10 11];
wvLngth2Data = [9 10 11 13];
%Determine length of wave length data vectors
n = length(wvLngth2Data);
%Initialize count of mathces variable for use in recording indexes
%of matching wave length values and creating unique wavelength value vector
count1 = 1;
count2 = 1;
%Find unique wavelength values
waveTot = [wvLngth1Data,wvLngth2Data];
%Determine total number of wavelength values
nT = length(waveTot);
%Intialize variables to indicate duplicate has been found and if current
%value is a duplicate
dupFound = false;
duplicate = false;
%Find unique wavelength values
for i = 1:nT-1
for j = i+1:nT
if (waveTot(i) == waveTot(j) )
repeatIndices(count1) = j;
count1 = count1 +1;
dupFound = true;
end
end
if (dupFound)
for k = 1:count1 - 1
if ( i == repeatIndices(k) )
duplicate = true;
end
end
end
if(~duplicate)
uniqueWaveVals(count2) = waveTot(i);
count2 = count2 + 1;
end
if( (j == nT) )
duplicate = false;
for k = 1:count1 - 1
if ( i == repeatIndices(k) )
duplicate = true;
end
end
if( ~duplicate )
uniqueWaveVals(count2) = waveTot(j);
end
end
duplicate = false;
end
%Determine number of unique wave length values
nUniques = length(uniqueWaveVals);
%Initialize variables to indicate where a unique waveform appears
foundIn1 = false;
foundIn2 = false;
%Initiate variables for recoding the index at which unique wavelengths are
%found
match1 = 0;
match2 = 0;
%Preallocate memory to store average values
avgIntensities = zeros(1,nUniques);
%Calculate average values for each unique wave form value
for i = 1:nUniques
foundIn1 = false;
foundIn2 = false;
for j = 1:n
if (wvLngth1Data(j) == uniqueWaveVals(i) )
foundIn1 = true;
match1 = j;
end
end
for j = 1:n
if (wvLngth2Data(j) == uniqueWaveVals(i) )
foundIn2 = true;
match2 = j;
end
end
if(foundIn1 && ~foundIn2)
avgIntensities(i) = int1Data(match1);
end
if(~foundIn1 && foundIn2)
avgIntensities(i) = int2Data(match2);
end
if(foundIn1 && foundIn2)
avgIntensities(i) = (int2Data(match2)+int1Data(match1))/2;
end
end
plot(uniqueWaveVals,avgIntensities)
title('Average Pixel Intensity VS Light Wavelength')
xlabel('Wavelength (units)')
ylabel('Average Pixel Intensity (units)')
If this is not quite what you are looking for, I hope that it at least gives you a few good ideas!
  1 Comment
Jason Powell
Jason Powell on 12 Jun 2019
Thanks James,
This is a great start to what I was thinking!!

Sign in to comment.

More Answers (1)

Guillaume Erny
Guillaume Erny on 7 Mar 2021
Edited: Guillaume Erny on 7 Mar 2021
Hi Jason,
If you want to align two set of data to a common axis, you should look at the function interp1.
I always use this function when I want to compare spectroscopic date with different axes and it work perfectly

Tags

Community Treasure Hunt

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

Start Hunting!