Я использую Matlab 2018b. Одна проблема возникла, когда я работаю с двумя векторами. Один имеет форму 4d, а другой - форму 1d. Я хотел бы вычесть значение вектора из значений другого вектора.
Идея:
Мне нужно запустить цикл для вектора A и вектора B. Внутри цикла я получу значение вектора A и вычту значение соответствующего индекса из B.
Но я хотел бы решить проблему более MATLAB, а не процедурным способом. Не могли бы вы помочь мне в этом?
Пример:
A=[val(:,:,1,1)
= 0.67
val(:,:,2,1)
=0.55
val(:,:,3,1)
=0.12
val(:,:,1,2)
= 0.12
val(:,:,2,2)
=0.50
val(:,:,3,2)
=0.11
]
B=[1
0]
Операция будет такой
Result=[
val(:,:,1,1) =0.67-1
val(:,:,2,1) =0.55-1
val(:,:,3,1) =0.12-1
val(:,:,1,2) =0.12-0
val(:,:,2,2) =0.5-0
val(:,:,3,2) =0.11-0
]
Спасибо,
Чтобы избежать использования permute
, вы можете использовать две хитрости:
Если вы хотите вычесть 1D-матрицу из 4D-матрицы, проблема заключается в том, что Matlab не знает, к какому измерению следует применить вычитание.
Но Matlab позволяет создавать матрицу с одноэлементным размером, например, можно создать матрицу 1x1x1x2.
Вот пример:
% Creation of the 4D matrix
A = rand(3,4,5,2);
% Creation of another 4D matrix but with 3 singleton dimension
B = [1,0];
B = reshape(B,1,1,1,2);
% ↑
% 4th dimension
%Now matlab know that the substraction should be applied on the 4th dimension.
X = A-B;
Другой пример:
% Creation of the 4D matrix
A = rand(3,4,2,5);
% Creation of another 4D matrix but with 2 singleton dimension
B = [1,0];
B = reshape(B,1,1,2); %could also be written reshape(B,1,1,2,1)
% ↑
% 3th dimension
%Now matlab know that the substraction should be applied on the 3th dimension.
X = A-B;
Это довольно распространенная операция в MATLAB, поэтому ее несложно выполнить. «Секрет» заключается в реорганизации элементов таким образом, чтобы они были совместимы для нужной вам операции. Взгляните на
reshape
иpermute
. Поскольку ваша версия MATLAB достаточно новая, вам даже не нужно будет использоватьbsxfun
(дополнительную информацию вы можете найти в Интернете по запросу «неявное расширение»). Если вы все еще не можете решить проблему после прочтения документации, пожалуйста, ответьте на этот комментарий.