Computes functions of arrays where the singleton dimensions of each have been expanded to be the size of the other, without actually copying any data.
x = rand(4,3,1,2);
y = rand(4,1,5,2);
z = genop(@times,x,y);
size(z) will be [4 3 5 2].
Douglas Schwarz (2020). Generalized Array Operations (https://www.mathworks.com/matlabcentral/fileexchange/10333-generalized-array-operations), MATLAB Central File Exchange. Retrieved .
An excellent "hack", a smart and computationally efficient algorithm. It is equivalent to BSXFUN (a builtin function introduced about a year later in MATLAB R2007a), and of course much slower, but it can be used as a replacement for BSXFUN by those who have earlier versions of MATLAB. This allowed me to ensure backward compatibility for version 2.0 of my MULTIPROD function, a generalization to N dimensions of the matrix product MTIMES (I am debugging it, I will publish it ass soon as it is ready):
MULTIPROD uses BSXFUN to implement singleton expansion and to increase computational speed.
There's another file in MATLAB Central File Exchange which does approximately the same job as GENOP (and perhaps more quickly), but does it less efficiently as for memory usage, by temporarily allocating a huge amount of additional memory to physically expand the arrays:
Absolutely perfect !
Comment by "A User" traces back to a limitation of the zeros function. I made changes to work around that and genop should work with logical functions now (as soon as the file gets updated).
Code gives error at line 75 when the function handle passed to the function returns a logical rather then a single, double, or integer.
Modified so it works with a function returning logical.
fixed documentation typo
Inspired: bsxfun substitute