Нахождение индексных позиций после умножения -spatial- matrix. bsxfun реализован
Мне нужна помощь в поиске некоторых позиций индекса матрицы и двух векторов после сложного умножения матриц, пожалуйста, потерпите меня и прочитайте то, что у меня есть сначала, мой вопрос подходит к концу.
У меня есть две матрицы L1
а также L2
:
L1 = firstMatrix;
L2 = secondMatrix;
Мне нужно вычислить разницу (по столбцам) каждого значения из L1
со всеми значениями L2
опять же, по столбцам, это делается следующим образом:
первый шаг
lib1 = bsxfun(@minus, L1(:,1)',L2(:,1));
lib1=lib1(:);
lib2 = bsxfun(@minus, L1(:,2)',L2(:,2));
lib2=lib2(:);
lib3 = bsxfun(@minus, L1(:,3)',L2(:,3));
lib3=lib3(:);
В конце у меня есть моя новая матрица LBR
:
LBR = [lib1 lib2 lib3];
Теперь у меня есть два вектора alpha
а также beta
-данные на закрытом домене с одинаковым размером шага, в этом случае они одинаковы.
alpha = 0:0.1:2;
beta = 0:0.1:2;
Теперь мне нужно вычислить тензорный продукт, я могу сделать это двумя способами:
шаг второй
Первый способ:
alphat1 = kron(alpha,lib1);
alphat2 = kron(alpha,lib2);
alphat3 = kron(alpha,lib3);
T1 = [alphat1 alphat2 alphat3];
betat1 = kron(beta,lib1);
betat2 = kron(beta,lib2);
betat3 = kron(beta,lib3);
T2 = [betat1 betat2 betat3];
Или, второй способ, который посредством bsxfun
из Matlab:
val = bsxfun(@times,LBR,permute(alpha,[3 1 2]));
T = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[]);
val2 = bsxfun(@times,LBR,permute(beta,[3 1 2]));
T2 = reshape(permute(val2,[1 3 2]),size(val2,1)*size(val2,3),[]);
Моя проблема:
Мне нужно найти min-distance
следующим образом, во-первых, у меня есть, конечно, три константы:
gama1 = value1;
gama2 = value2;
gama3 = value3;
И min-distance
рассчитывается следующим образом:
шаг третий
[d,p] = min(((T(:,1)-T2(:,1))-gama1).^2 + ((T(:,2)-T2(:,2))-gama2).^2 +
((T(:,3)-T2(:,3))-gama3).^2);
d = sqrt(d);
Мне очень нужны индексные позиции L1
, L2
, alpha
а также beta
которые выполняют это min-distance
проблема.
Я пробовал следующее:
шаг четвертый
[minindex_alongL2, minindex_alongL1, minindex_alongalpha, minindex_alongbeta] =
ind2sub([size(L2,1) size(L1,1) numel(alpha) numel(beta)],p);
Но это не работает. Я был бы очень признателен за любую помощь, которую вы можете оказать мне!
Заранее спасибо.
1 ответ
alpha
а также beta
получает T
а также T2
соответственно. Затем вы выполняете вычитание по столбцам между T
а также T2
а не вычитание для каждого элемента столбца в T
против всех элементов с одинаковым номером столбца в T2
, Если вы хотите выполнить последнее, вам, скорее всего, потребуется изменить коды с нуля и избавиться от конкатенаций и расширения до многомерных массивов.
Продолжая то, что у вас есть в ваших кодах, вы можете, самое большее, объединиться alpha-beta
индексы, а не отдельные индексы для alpha
а также beta
,
Таким образом, вы можете иметь что-то вроде -
[minindex_alongL2, minindex_alongL1, minindex_alongalphabeta] = ind2sub([size(L2,1) size(L1,1) numel(alpha)],p)
Изменить 1: Предполагая, что вы вводите значения для L1
, L2
, value1
, value2
, value3
и строки векторов alpha
а также beta
Посмотрите, работает ли этот код для вас -
lib1 = bsxfun(@minus, L1(:,1)',L2(:,1)); %%//'
lib2 = bsxfun(@minus, L1(:,2)',L2(:,2)); %%//'
lib3 = bsxfun(@minus, L1(:,3)',L2(:,3)); %%//'
t1 = cat(3,lib1,lib2,lib3);
t2 = permute(alpha,[4 3 1 2]);
T = bsxfun(@times,t1,t2);
t22 = permute(beta,[4 3 1 2]);
T2 = bsxfun(@times,t1,t22);
gama1 = value1;
gama2 = value2;
gama3 = value3;
mat1 = bsxfun(@minus,T,permute(T2,[1 2 3 5 4]));
mat2 = bsxfun(@minus,mat1,permute([gama1;gama2;gama3],[3 2 1]));
mat2 = squeeze(sum(mat2,3));
[d,p] = min(mat2(:));
d = sqrt(d);
[minindex_alongL2, minindex_alongL1, minindex_alongalpha, minindex_alongbeta] = ind2sub([size(L2,1) size(L1,1) numel(alpha) numel(beta)],p)