Pregunta ¿Hay un operador de splat (o equivalente) en Matlab?


Si tengo una matriz (de longitud desconocida hasta el tiempo de ejecución), ¿hay alguna manera de llamar a una función con cada elemento de la matriz como un parámetro separado?

Al igual que:

foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)

Contexto: Tengo una lista de índices para un n-d matriz, Q. Lo que quiero es algo como Q(a,b,:), pero solo tengo [a,b]. Ya que no sé n, No puedo simplemente codificar la indexación.


6
2018-01-11 19:39


origen


Respuestas:


No hay operador en MATLAB que haga eso. Sin embargo, si sus índices (es decir, bar en su ejemplo) fueron almacenados en un matriz de células, entonces podrías hacer esto:

bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

los {:} crea un lista separada por comas desde una matriz de celdas. Eso es probablemente lo más cercano que puede obtener al formulario de "operador" que tiene en su ejemplo, además de anular uno de los operadores existentes (ilustrado aquí y aquí) para que genere una lista separada por comas de una matriz estándar, o crear su propia clase para almacenar sus índices y definir cómo operan los operadores existentes para ella (¡ninguna opción para los débiles de corazón!).

Para su ejemplo específico de indexación de una matriz N-D arbitraria, también puede calcular un índice lineal a partir de sus índices suscritos utilizando la sub2ind función (como se detalla aquí y aquí), pero podría terminar haciendo más trabajo de lo que haría con mi solución de lista separada por comas. Otra alternativa es calcula el índice lineal tú mismo, que eludiría convertir a una matriz de celdas y usa solo operaciones de matriz / vector. Aquí hay un ejemplo:

% Precompute these somewhere:
scale = cumprod(size(Q)).';  %'
scale = [1; scale(1:end-1)];
shift = [0 ones(1, ndims(Q)-1)];

% Then compute a linear index like this:
indices = [3 4 5];
linearIndex = (indices-shift)*scale;
Q(linearIndex)  % Equivalent to Q(3,4,5)

7
2018-01-11 19:47