Automatically set number of outputs of the gradient function

조회 수: 3 (최근 30일)
tiwwexx
tiwwexx 2023년 8월 24일
댓글: tiwwexx 2023년 8월 29일
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
Bruno Luong
Bruno Luong 2023년 8월 24일
it probably miss a second colon on lhs
if numel(size(DATA))==2
[grad_vec(:,:,1),grad_vec(:,:,2)] = gradient(DATA);
...

댓글을 달려면 로그인하십시오.

채택된 답변

Bruno Luong
Bruno Luong 2023년 8월 24일
편집: Bruno Luong 2023년 8월 24일
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
Bruno Luong
Bruno Luong 2023년 8월 29일
편집: Bruno Luong 2023년 8월 29일
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)

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 MATLAB에 대해 자세히 알아보기

태그

제품


릴리스

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by