Supponiamo di disporre di un struct array arr
, in cui ogni elemento ha un gruppo di campi, incluso uno chiamato val
. Mi piacerebbe incrementare il campo di ogni elemento val
da una certa quantità costante, in questo modo:Aggiornamento di un campo in ogni elemento di un array di strutture Matlab
for i = 1:length(arr)
arr(i).val = arr(i).val + 3;
end
Questo funziona, ovviamente, ma credo che ci dovrebbe essere un modo per fare questo in una sola riga di codice (e non per ciclo continuo). Il meglio che ho trovato è di due righe e richiede una variabile temporanea:
newVals = num2cell([arr.val] + 3);
[arr.val] = deal(newVals{:});
Qualche idea? Grazie.
Grazie per il suggerimento su "affare". Non sapevo di 'setfield', quindi sembra che lo faccia in una riga, ma come dici tu, questo è sicuramente peggio della soluzione per il ciclo. Per quanto riguarda l'indicizzazione del genere, l'ho esaminata qualche tempo fa; In sostanza, Mathworks sostiene che il supporto di qualcosa di simile imporrebbe modifiche alla parser di incompatibilità della compatibilità. Il che è un peccato, dato che mi infastidisce quasi ogni volta che scrivo un codice Matlab. – Carl
Grazie per questa risposta! In MATLAB 2013b, [arr.val] = newVals {:} funziona MA arr.val = newVals {:}. Cosa fanno esattamente le parentesi in questo caso? –
'arrayfun' è solo un wrapper per un ciclo' for' in MATLAB, quindi tecnicamente stai ancora usando i loop, anche se sotto mentite spoglie. – Adriaan