Automatically set number of outputs of the gradient function

3 visualizzazioni (ultimi 30 giorni)
I have a loss function I define to minimize some gradient magnitude. However, the dimension of my input data will change so I want to make my gradient have a generalized output. I have something close to a solution but Dont know how to get rid of the hard coded 2nd line below.
grad_vec = zeros([size(DATA),numel(size(DATA))]);
[grad_vec(:,:,:,1),grad_vec(:,:,:,2),grad_vec(:,:,:,3)] = gradient(DATA);
grad_mag = (sum(abs(grad_vec).^n,numel(size(DATA)))).^(1/n);
  3 Commenti
Bruno Luong
Bruno Luong il 24 Ago 2023
it probably miss a second colon on lhs
if numel(size(DATA))==2
[grad_vec(:,:,1),grad_vec(:,:,2)] = gradient(DATA);
...

Accedi per commentare.

Risposta accettata

Bruno Luong
Bruno Luong il 24 Ago 2023
Modificato: Bruno Luong il 24 Ago 2023
A = rand(10,10,10);
% This works for any dimensions of A
if isvector(A) % EDIT
N = 1;
else
N = ndims(A); % 3 in this example
end
G = cell(1,N);
[G{:}] = gradient(A);
G = cat(N+1,G{:});
size(G)
ans = 1×4
10 10 10 3
p = 2; % whatever power in >=1
Gmag = sum(abs(G).^p,N+1).^(1/p);
size(Gmag)
ans = 1×3
10 10 10
  3 Commenti
Bruno Luong
Bruno Luong il 29 Ago 2023
Modificato: Bruno Luong il 29 Ago 2023
Not only it's good but it's also correct.
FYI you accept an answer from @Star Strider that is not correct (it ignores all the partial derivatives wrt to dimension > 1)

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Tag

Prodotti


Release

R2023a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by