changeset 5397:5b312a4d11bc octave-forge

move if-decisions outside of loops
author schloegl
date Thu, 05 Mar 2009 16:05:10 +0000
parents c349b8c23cfe
children 385e3919ec2e
files extra/NaN/src/sumskipnan_mex.cpp
diffstat 1 files changed, 237 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/extra/NaN/src/sumskipnan_mex.cpp	Thu Mar 05 15:20:46 2009 +0000
+++ b/extra/NaN/src/sumskipnan_mex.cpp	Thu Mar 05 16:05:10 2009 +0000
@@ -53,7 +53,7 @@
     	double* 	LOutputCount;
     	double* 	LOutputSum2;
     	double* 	LOutputSum4;
-    	double  	x, x2;
+    	double  	x, x2, x2i;
     	unsigned long   LCount, LCountI;
     	double  	LSum, LSum2, LSum4;
 
@@ -77,31 +77,9 @@
 	else 	
 		mexErrMsgTxt("First argument must be DOUBLE.");
 
-	if(mxIsLogical(PInputs[0]))
-		LInput  = (double*)mxGetLogicals(PInputs[0]);
-	else if(mxIsNumeric(PInputs[0]))
-		LInput  = mxGetPr(PInputs[0]);
-	else if(mxIsSparse(PInputs[0]))
-		LInput  = mxGetPr(PInputs[0]);
-	else if(mxIsInt8(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else if(mxIsUint8(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else if(mxIsInt16(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else if(mxIsUint16(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else if(mxIsInt32(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else if(mxIsUint32(PInputs[0]))
-		LInput  = (double *)mxGetData(PInputs[0]);
-	else
-		mexErrMsgTxt("First argument must be NUMERIC.");
 
 	if(mxIsComplex(PInputs[0]))
 		LInputI = mxGetPi(PInputs[0]);
-	if(mxIsComplex(PInputs[0]) & (POutputCount > 3))
-	        mexErrMsgTxt("More than 3 output arguments only supported for REAL data ");
 
     	// get 2nd argument
     	if  (PInputCount == 2){
@@ -172,61 +150,259 @@
 
 	mxFree(SZ2);
 
-	// OUTER LOOP: along dimensions > DIM
-	for (l = 0; l<D3; l++) 	
-    	{
-		ix2 =   l*D1;	// index for output 
-		ix1 = ix2*D2;	// index for input 
+	if ((POutputCount == 2)	&& !mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+	    	{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
 
-		// Inner LOOP: along dimensions < DIM
-		for (k = 0; k<D1; k++, ix1++, ix2++) 	
-		{
-		        LCount = 0;
-			LSum   = 0.0;
-			LSum2  = 0.0;
-			LSum4  = 0.0;
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
+			{
+		        	LCount = 0;
+				LSum   = 0.0;
 	        	    		
-			// LOOP  along dimension DIM
-	    		for (j=0; j<D2; j++) 	
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
+				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+					}
+				}
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+               		}
+               	}		
+		return; 
+	}
+	else if ((POutputCount == 1) && !mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+	    	{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
+
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
 			{
-				x = LInput[ix1 + j*D1];
-        	        	if (!mxIsNaN(x))
+				LSum   = 0.0;
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
+				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LSum += x; 
+					}
+				}
+				LOutputSum[ix2] = LSum;
+               		}
+               	}		
+		return; 
+	}
+	else if ((POutputCount == 3) && !mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+    		{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
+
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
+			{
+		        	LCount = 0;
+				LSum   = 0.0;
+				LSum2  = 0.0;
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
 				{
-					LCount++; 
-					LSum += x; 
-					x2 = x*x;
-					LSum2 += x2; 
-					LSum4 += x2*x2; 
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+						LSum2 += x*x; 
+					}
+				}
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+       	        		LOutputSum2[ix2] = LSum2;
+               		}
+               	}		
+	}
+	else if ((POutputCount == 4) && !mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+    		{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
+
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
+			{
+		        	LCount = 0;
+				LSum   = 0.0;
+				LSum2  = 0.0;
+				LSum4  = 0.0;
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
+				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+						x2 = x*x;
+						LSum2 += x2; 
+						LSum4 += x2*x2; 
+					}
 				}
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+       	        		LOutputSum2[ix2] = LSum2;
+               			LOutputSum4[ix2] = LSum4;
+               		}
+               	}		
+	}
+	else if ((POutputCount == 2) && mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+    		{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
+
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
+			{
+		        	LCount = 0;
+				LSum   = 0.0;
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
+				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+					}
+					x = LInputI[ix1 + j*D1];
+       	        			if (!mxIsNaN(x))
+					{
+						LCountI++; 
+						LSum  += x; 
+					}
+				}	
+				if (LCount != LCountI)
+		            		mexErrMsgTxt("Number of NaNs is different for REAL and IMAG part");
+
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+
 			}
-			LOutputSum[ix2] = LSum;
-            		if (POutputCount >= 2)
-                		LOutputCount[ix2] = (double)LCount;
-            		if (POutputCount >= 3)
-                		LOutputSum2[ix2] = LSum2;
-            		if (POutputCount >= 4)
-                		LOutputSum4[ix2] = LSum4;
+		}
+	}
+	else if ((POutputCount == 3) && mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+    		{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
 
-			if(mxIsComplex(PInputs[0]))
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
 			{
-				LSum = 0.0;	
-	    			LCountI = 0;
+		        	LCount = 0;
+				LSum   = 0.0;
 				LSum2  = 0.0;
-				for (j=0; j<D2; j++) 	
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
 				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+						LSum2 += x*x; 
+					}
 					x = LInputI[ix1 + j*D1];
-        	        		if (!mxIsNaN(x))
+       	        			if (!mxIsNaN(x))
 					{
 						LCountI++; 
 						LSum  += x; 
 						LSum2 += x*x; 
 					}
-				}
-				LOutputSumI[ix2] = LSum;
+				}	
 				if (LCount != LCountI)
-			            	mexErrMsgTxt("Number of NaNs is different for REAL and IMAG part");
-	            		if (POutputCount >= 3)
-        	        		LOutputSum2[ix2] += LSum2;
+		            		mexErrMsgTxt("Number of NaNs is different for REAL and IMAG part");
+
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+       	        		LOutputSum2[ix2] = LSum2;
+
+			}
+		}
+	}
+	else if ((POutputCount == 4) && mxIsComplex(PInputs[0]))
+	{
+		// OUTER LOOP: along dimensions > DIM
+		for (l = 0; l<D3; l++) 	
+    		{
+			ix2 =   l*D1;	// index for output 
+			ix1 = ix2*D2;	// index for input 
+
+			// Inner LOOP: along dimensions < DIM
+			for (k = 0; k<D1; k++, ix1++, ix2++) 	
+			{
+		        	LCount = 0;
+				LSum   = 0.0;
+				LSum2  = 0.0;
+				LSum4  = 0.0;
+	        	    		
+				// LOOP  along dimension DIM
+		    		for (j=0; j<D2; j++) 	
+				{
+					x = LInput[ix1 + j*D1];
+        	        		if (!mxIsNaN(x))
+					{
+						LCount++; 
+						LSum += x; 
+						x2 = x*x;
+						LSum2 += x2; 
+					}
+					x = LInputI[ix1 + j*D1];
+       	        			if (!mxIsNaN(x))
+					{
+						LCountI++; 
+						LSum  += x; 
+						x2i = x*x;
+						LSum2 += x2i; 
+						x2 += x2i; 
+						LSum4 += x2*x2; 
+					}
+				}	
+				if (LCount != LCountI)
+		            		mexErrMsgTxt("Number of NaNs is different for REAL and IMAG part");
+
+				LOutputSum[ix2] = LSum;
+               			LOutputCount[ix2] = (double)LCount;
+       	        		LOutputSum2[ix2] = LSum2;
+               			LOutputSum4[ix2] = LSum4;
+
 			}
 		}
 	}