loop for a+bx using multiple waves and indices??

i am trying to write loop that will perform a simple y = a+bx calculation using several 1D waves.

the loop will calculate y from 12 different x waves. each 1D x wave has multiple values. the x waves are called ion0, ion1, ..., ion11

the coefficients a and b are derived from 12 different coefficient waves in which p=0 defines a and p=1 defines b.
the coefficient waves are called coeff0, coeff1, ... coeff11. so a of coeff0 is coeff0[0] and b of coeff0 is coeff0[1].

the loop will need to cycle through all point values in each ion wave before moving on to the next ion and coefficient.

the name of the destination wave will also need to coordinate with ion values.

i have tried to use a matrixop in a for loop to deal with this problem, but my attempts have been unsuccessful.

the current data i'm using is derived from a larger procedure which can be found at the bottom of this post. pertinent files for loading are attached (open snow.txt first and ionconcentrations.txt second)

my code looks like this:


for(index = 0; index<12; index+=1)
		for(i=0; i<5; i+=1)
		matrixop $("CalcConc"+num2str(index))= $("coeff"+num2str(index))[0] +  $("coeff"+num2str(index))[1] * $("ion"+num2str(index))[i]
		endfor
	endfor


this method doesn't work for reasons that are probably obvious to more experienced igor users than me (1month).
i'd really appreciate some assistance if anyone sees the way through this problem.

thanks in advance!
Ryan


#pragma rtGlobals=3		// Use modern global access method and strict wave access.
Function load(pathName, filePath)
	string pathName, filePath
	
	if (strlen(filePath) == 0)
		Open/D/R/P=$pathName refNum as filePath
		if (strlen(S_fileName) == 0)
			return -1
		endif
		filePath = S_fileName
	endif
	
	LoadWave/J/D/K=2/A/V={""," $",0,0}/L={0,0,0,0,1}/P=$pathName filePath
	wave/T wave0
	Extract4thColumn(wave0)
 
	wave Sig1
	
	make/o/N=(numPnts(Sig1)) PeakArea
	PeakArea = Sig1
	MatrixOp/o PeakArea = replace(PeakArea, NaN, 0)
	
	
	variable index
	string name, name2
	make/o/N=10 tempwave
	
	for(index = 0; index<12; index+=1)
		name = "PA" + num2str(index)
		name2 = "ion" + num2str(index)
		extract/o PeakArea, tempwave, p>=14*index && p<=14*index + 13
		duplicate tempwave, $name
		duplicate tempwave, $name2
		
	endfor
	
	killwaves tempwave
	
	make/o/N=14 ion0, ion1, ion2, ion3, ion4, ion5, ion6, ion7, ion8, ion9, ion10, ion11
	deletepoints 0, 10, ion0, ion1, ion2, ion3, ion4, ion5, ion6, ion7, ion8, ion9, ion10, ion11
	edit ion0, ion1, ion2, ion3, ion4, ion5, ion6, ion7, ion8, ion9, ion10, ion11
	
	make/o/N=10 PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11
	edit PeakArea
	appendtotable PA0, PA1, PA2, PA3, PA4, PA5, PA6, PA7, PA8, PA9, PA10, PA11
	
	load2("","")
	
	wave conc0, conc1, conc2, conc3, conc4, conc5, conc6, conc7, conc8, conc9, conc10, conc11
	string nom, nom2
	
	for(index = 0; index<12; index+=1)
		nom = "Coeff" + num2str(index)
		nom2 = "SD" + num2str(index)
			
		CurveFit/NTHR=0 line $("Conc"+num2str(index)) /X=$("PA"+num2str(index))
		wave w_coef, w_sigma
		duplicate w_coef, $nom
		duplicate w_sigma $nom2
		appendtotable $nom, $nom2
	endfor
	wave coeff0, coeff1, coeff2, coeff3, coeff4, coeff5, coeff6, coeff7, coeff8, coeff9, coeff10, coeff11
	variable i

	for(index = 0; index<12; index+=1)
		for(i=0; i<5; i+=1)
		matrixop $("CalcConc"+num2str(index))= $("coeff"+num2str(index))[0] +  $("coeff"+num2str(index))[1] * $("ion"+num2str(index))[i]
		endfor
	endfor
	
	
End

Function load2(pathName, filePath)
	string pathName, filePath
	
	if (strlen(filePath) == 0)
		Open/D/R/P=$pathName refNumas filePath
		if (strlen(S_fileName) == 0)
			return -1
		endif
		filePath = S_fileName
	endif
	
	LoadWave/J/D/O/K=1/A/B="N='Concentration';"/P=$pathName filePath
	wave Concentration
	
	variable index
	string name
	make/o/N=10 tempwave
	edit Concentration
	appendtotable
	for(index=0; index<12; index+=1)
		name = "Conc" + num2str(index)
		extract/o Concentration, tempwave, p>=10*index && p<=10*index + 9
		duplicate/o tempwave, $name
		appendtotable $name
	endfor
	
	killwaves tempwave
	
	
End


Function Extract4thColumn(w)
	wave/T w
	w = ReplaceString("\t\t",w[p], "\t")
	make/d/o/n=(DimSize(w,0)) Sig1
	Sig1 = str2num(StringFromList(3, w[p], "\t"))
End
050514snow_0.txt (3.8 KB) ion concentrations.txt (521 bytes)
Looking at your MatrixOP line:

		matrixop $("CalcConc"+num2str(index))= $("coeff"+num2str(index))[0] +  $("coeff"+num2str(index))[1] * $("ion"+num2str(index))[i]


This is not going to work because MatrixOP does not support any strings on the right hand side of the equation.

The packing of your coefficients (a) and (b) leave something to be desired. I'd rearrange them as separate waves wa={a[i]} and wb={b[i]}, then concatenate all the x waves as columns of a matrix, say wavex. The result would be a simple matrix equation:

Variable nrows=dimsize(wavex)
MatrixOP/O yWave=rowRepeat(wa,nrows)+rowRepeat(wb,nrows)*wavex


A.G.
WaveMetrics, Inc.