Hi Michael, Thanks for that. The X1 and X2 are vectors are typically 1000 by 3 matrices, and hoping to scale up to much larger dimensions (say 20,000 by 3).
I do appreciate your help and seems like this is the best way to do this, I was just wondering if I could squeeze out just a bit more performance, thats all. Anyway thanks again, much appreciated. Thanks, Sachin On Fri, Nov 18, 2011 at 9:15 AM, R. Michael Weylandt < michael.weyla...@gmail.com> wrote: > I fail to see why you would need another idea: you asked how to > multiply matrices efficiently, I told you how to multiply matrices > efficiently. > > if you want to calculate X1-X2 times W times X1-X2, then simply do so: > > X1 <- matrix(1:6, 3) > X2 <- matrix(7:12, 3) > W = matrix(runif(9), 3) > > t(X1-X2) %*% W %*% (X1-X2) > > which gives > > 142.7789 142.7789 > 142.7789 142.7789 > > You could squeeze out one iota more of speed with > > crossprod(X1-X2, W) %*% (X1-X2) > > to get the same result, but unless you are doing massive scale linear > processing, I'm not sure it's worth the loss of clarity. > > I was only giving you a heads up on the sometimes confusing difference > between matrix multiplication in MATLAB and in R by which a vector is > not a 1d matrix and so does not require explicit transposition. > > Michael > > > On Thu, Nov 17, 2011 at 4:35 PM, Sachinthaka Abeywardana > <sachin.abeyward...@gmail.com> wrote: > > I'm not quite sure of what you mean by not worry if it's 1d R matrices. > X1 > > and X2 are both n by d matrices and W is d by d. > > > > Thanks for the help though. Any other ideas? > > > > Thanks > > Sachin > > > > On Friday, November 18, 2011, R. Michael Weylandt > > <michael.weyla...@gmail.com> wrote: > >> The fastest is probably to just implement the matrix calculation > >> directly in R with the %*% operator. > >> > >> (X1-X2) %*% W %*% (X1-X2) > >> > >> You don't need to worry about the transposing if you are passing R > >> vectors X1,X2. If they are 1-d matrices, you might need to. > >> > >> Michael > >> > >> On Thu, Nov 17, 2011 at 1:30 AM, Sachinthaka Abeywardana > >> <sachin.abeyward...@gmail.com> wrote: > >>> Hi All, > >>> > >>> I am trying to convert the following piece of matlab code to R: > >>> > >>> XX1 = sum(w(:,ones(1,N1)).*X1.*X1,1); #square the elements of > >>> X1, > >>> weight it and repeat this vector N1 times > >>> XX2 = sum(w(:,ones(1,N2)).*X2.*X2,1); #square the elements of > >>> X2, > >>> weigh and repeat this vector N2 times > >>> X1X2 = (w(:,ones(1,N1)).*X1)'*X2; #get the weighted > >>> 'covariance' term > >>> XX1T = XX1'; #transpose > >>> z = XX1T(:,ones(1,N2)) + XX2(ones(1,N1),:) - 2*X1X2; #get > the > >>> squared weighted distance > >>> > >>> which is basically doing: z=(X1-X2)' W (X1-X2) > >>> > >>> What would the best way (for SPEED) to do this? or is vectorizing as > >>> above > >>> the best? Any hints, suggestions? > >>> > >>> Thanks, > >>> Sachin > >>> > >>> [[alternative HTML version deleted]] > >>> > >>> ______________________________________________ > >>> R-help@r-project.org mailing list > >>> https://stat.ethz.ch/mailman/listinfo/r-help > >>> PLEASE do read the posting guide > >>> http://www.R-project.org/posting-guide.html > >>> and provide commented, minimal, self-contained, reproducible code. > >>> > >> > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.