NAME scnvcor - compute the convolution or correlation of real vectors SUBROUTINE SCNVCOR (CNVCOR, FOUR, NX, X, IFX, INCX, NY, NPRE, M, Y, IFY, INC1Y, INC2Y, NZ, K, Z, IFZ, INC1Z, INC2Z, WORK, LWORK) CHARACTER CNVCOR, FOUR INTEGER IFX, IFY, IFZ, INCX, INC1Y, INC2Y, INC1Z, INC2Z, K, LWORK, NPRE, NX, NY, M, NZ REAL X(*), Y(*), Z(*) REAL WORK(*) #include <sunperf.h> void scnvcor(char cnvcor, char four, int nx, float *x, int ifx, int incx, int ny, int npre, int m, float *y, int ify, int inc1y, int inc2y, int nz, int k, float *z, int ifz, int inc1z, int inc2z, float *work, int lwork); PURPOSE SCNVCOR computes the convolution or correlation of real vec- tors. ARGUMENTS CNVCOR (input) CHARACTER 'V' or 'v' if convolution is desired, 'R' or 'r' or correlation is desired. FOUR (input) CHARACTER 'T' or 't' if the Fourier transform method is to be used, 'D' or 'd' if the computation should be done directly from the definition. The Fourier transform method is generally faster, but it may introduce noticeable errors into certain results, notably when both the filter and data vectors con- sist entirely of integers or vectors where ele- ments of either the filter vector or a given data vector differ significantly in magnitude from the 1-norm of the vector. NX (input) INTEGER Length of the filter vector. NX >= 0. SCNVCOR will return immediately if NX = 0. X (input) REAL(*) Filter vector. IFX (input) COMPLEX(*) Index of the first element of X. NX >= IFX >= 1. INCX (input) INTEGER Stride between elements of the filter vector in X. INCX > 0. NY (input) INTEGER Length of the input vectors. NY >= 0. SCNVCOR will return immediately if NY = 0. NPRE (input) INTEGER The number of implicit zeros prepended to the Y vectors. NPRE >= 0. Y (input) REAL(*) Input vectors. IFY (input) COMPLEX(*) Index of the first element of Y. NY >= IFY >= 1. INC1Y (input) INTEGER Stride between elements of the input vectors in Y. INC1Y > 0. INC2Y (input) INTEGER Stride between the input vectors in Y. INC2Y > 0. NZ (input) INTEGER Length of the output vectors. NZ >= 0. SCNVCOR will return immediately if NZ = 0. See the Notes section below for information about how this argu- ment interacts with NX and NY to control circular versus end-off shifting. K (input) INTEGER Number of Z vectors. K >= 0. If K = 0 then SCNVCOR will return immediately. If K < M then only the first K input vectors will be processed. If K > M then all input vectors will be processed and the last M-K output vectors will be set to zero on exit. Z (output) REAL(*) Result vectors. IFZ (input) COMPLEX(*) Index of the first element of Z. NZ >= IFZ >= 1. INC1Z (input) INTEGER Stride between elements of the output vectors in Z. INC1Z > 0. INC2Z (input) INTEGER Stride between the output vectors in Z. INC2Z > 0. WORK (input/scratch) REAL(LWORK) Scratch space. Before the first call to SCNVCOR with particular values of the integer arguments the first element of WORK must be set to zero. If WORK is written between calls to SCNVCOR or if SCNVCOR is called with different values of the integer arguments then the first element of WORK must again be set to zero before each call. If WORK has not been written and the same values of the integer arguments are used then the first ele- ment of WORK to zero. This can avoid certain ini- tializations that store their results into WORK, and avoiding the initialization can make SCNVCOR run faster. LWORK (input) INTEGER Length of WORK. LWORK >= 4*MAX(NX,NY,NZ)+15. NOTES If any vector overlaps a writable vector, either because of argument aliasing or ill-chosen values of the various INC arguments, the results are undefined and may vary from one run to the next. The most common form of the computation, and the case that executes fastest, is applying a filter vector X to a series of vectors stored in the columns of Y with the result placed into the columns of Z. In that case, INCX = 1, INC1Y = 1, INC2Y >= NY, INC1Z = 1, INC2Z >= NZ. Another common form is applying a filter vector X to a series of vectors stored in the rows of Y and store the result in the row of Z, in which case INCX = 1, INC1Y >= NY, INC2Y = 1, INC1Z >= NZ, and INC2Z = 1. A common use of convolution is to compute the products of polynomials. The following code uses SCNVCOR to compute the product of 1 + 2x + 3x**2 and 4 + 5x + 6x**2: PROGRAM TEST IMPLICIT NONE C INTEGER LWORK, NX, NY, NZ PARAMETER (NX = 3) PARAMETER (NY = NX) PARAMETER (NZ = 2*NY-1) PARAMETER (LWORK = 4*NZ+32) C REAL X(NX), Y(NY), Z(NZ), WORK(LWORK) C DATA X / 1, 2, 3 /, Y / 4, 5, 6 /, WORK / LWORK*0 / C PRINT 1000, 'X' PRINT 1010, X PRINT 1000, 'Y' PRINT 1010, Y CALL SCNVCOR ('V', 'T', NX, X, 1, 1, $ NY, 0, 1, Y, 1, 1, 1, $ NZ, 1, Z, 1, 1, 1, WORK, LWORK) PRINT 1020, 'Z' PRINT 1010, Z C 1000 FORMAT (1X, 'Input vector ', A1) 1010 FORMAT (1X, 300F5.0) 1020 FORMAT (1X, 'Output vector ', A1) C END The program above produces the following output: Input vector X 1. 2. 3. Input vector Y 4. 5. 6. Output vector Z 4. 13. 28. 27. 18. Making the output vector longer than the input vectors, as in the example above, implicitly adds zeros to the end of the input. No zeros are actually required in any of the vectors, and none are used in the example, but the padding provided by the implied zeros has the effect of an end-off shift rather than an end-around shift of the input vectors. The following code will compute the product between the vec- tor [ 1, 2, 3 ] and the circulant matrix defined by the initial column vector [ 4, 5, 6 ]: PROGRAM TEST IMPLICIT NONE C INTEGER LWORK, NX, NY, NZ PARAMETER (NX = 3) PARAMETER (NY = NX) PARAMETER (NZ = NY) PARAMETER (LWORK = 4*NZ+32) C REAL X(NX), Y(NY), Z(NZ), WORK(LWORK) C DATA X / 1, 2, 3 /, Y / 4, 5, 6 /, WORK / LWORK*0 / C PRINT 1000, 'X' PRINT 1010, X PRINT 1000, 'Y' PRINT 1010, Y CALL SCNVCOR ('V', 'T', NX, X, 1, 1, $ NY, 0, 1, Y, 1, 1, 1, $ NZ, 1, Z, 1, 1, 1, WORK, LWORK) PRINT 1020, 'Z' PRINT 1010, Z C 1000 FORMAT (1X, 'Input vector ', A1) 1010 FORMAT (1X, 300F5.0) 1020 FORMAT (1X, 'Output vector ', A1) C END The program above produces the following output: Input vector X 1. 2. 3. Input vector Y 4. 5. 6. Output vector Z 31. 31. 28. The difference between this example and the previous example is that the length of the output vector is the same as the length of the input vectors, so there are no implied zeros on the end. With no implied zeros to shift into, the effect of an end-off shift from the previous example does not occur and the end-around shift results in a circulant matrix pro- duct.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |