Jaroslav Hajek wrote: > On Tue, May 25, 2010 at 1:16 PM, Alois Schlögl <alois.schlo...@tugraz.at> > wrote: >> Søren Hauberg wrote: >>>>>> - c = 1 + sum ((x-y)(:)'*z*((x-y)(:))); >>>>>> + c = 1 + sum (vec(x-y)'*z*(vec(x-y))); >>>>> What is the purpose of this (and similar) change? >>>> Its again an issue with oct2mat, which can not deal well with (x-y)(:), >>>> especially if these are used within more complicated constructs. Using >>>> vec() avoids this problem. >>> Can't 'oct2mat' just call 'vec' for these types of expressions? It just >>> seems to me that changing code to fit 'oct2mat' is not the right >>> approach (it should be the other way around; that way 'oct2mat' would be >>> more useful). In this case it might even have an impact on performance, >>> though I doubt it matters. >> >> No, its not possible to have a general purpose solution for the (...)(:) >> issue. Lets look at the following example [F (x-y)(:)]. >> If F is a function, it should be converted to [vec(F(x-y))], but if F is >> a variable, the correct translation is [F vec(x-y)]. oct2mat can not >> know which is correct, because it needs to know the context of this >> expression. In worst case, whether F is a function or variable is >> determined only at runtime. >> > > Er, no, (un?)fortunately. This is one of the design flaws of Matlab. > [F (x-y)(:)] is always interpreted as [F, (x-y)(:)], regardless of > whether F is a function or a variable. I think that (expr)(:) should > be always equivalent to vec(expr), at least I can't think of a > counter-example.
Here is a counter-example F(expr)(:) In this case Fvec(expr) or F(vec(expr)) won't do, only vec(F(expr)) is the correct translation. On the contrary, I don't want the former being > converted to the latter, because the latter involves an extra overhead > of a function call. How difficult is it to have "vec" as a builtin-function, with an overhead as small as the colon (:) operator ? > > I would also like to note that > > arglist = {args{1:narg-1}, x+a*dx, args{narg+1:end}}; > fx = feval (f,arglist{:}); > > can be simply written as > > fx = feval (f, args{1:narg-1}, x+a*dx, args{narg+1:end}); > > i.e. you can use more than one cs-lists in an expression. > > Good to know. A. ------------------------------------------------------------------------------ _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev