Я хотел бы иметь возможность быстро определить, можно ли разделить данное двумерное ядро целочисленных коэффициентов на два одномерных ядра с целочисленными коэффициентами. Например
2 3 2
4 6 4
2 3 2
делится на
2 3 2
а также
1
2
1
Фактический тест на разделимость кажется довольно простым с использованием целочисленной арифметики, но разложение на 1D-фильтры с целыми коэффициентами оказывается более сложной задачей. Трудность заключается в том, что отношения между строками или столбцами могут быть нецелыми (рациональные дроби), например, в приведенном выше примере мы имеем отношения 2, 1/2, 3/2 и 2/3.
Я действительно не хочу использовать тяжелый подход, такой как SVD, потому что (a) это относительно вычислительно дорого для моих нужд и (b) это все еще не обязательно помогает определить целые коэффициенты.
Любые идеи ?
ДАЛЬНЕЙШАЯ ИНФОРМАЦИЯ
Коэффициенты могут быть положительными, отрицательными или нулевыми, и могут быть патологические случаи, когда сумма одного или обоих одномерных векторов равна нулю, например
-1 2 -1
0 0 0
1 -2 1
делится на
1 -2 1
а также
-1
0
1
источник
Ответы:
Я взял
@Phonon
ответ и несколько изменил его, чтобы он использовал подход GCD только для верхней строки и левого столбца, а не для сумм строк / столбцов. Это, кажется, справляется с патологическими случаями немного лучше. Он все еще может потерпеть неудачу, если верхняя строка или левый столбец - все нули, но эти случаи могут быть проверены до применения этого метода.Большое спасибо
@Phonon
и@Jason R
за оригинальные идеи для этого.источник
Понял! Размещая код MATLAB, выложу объяснение сегодня вечером или завтра
источник
A=[-2 1 0 -1 2]; B=[2 -3 6 0 -1]; M=A'*B;
. Проблема здесь в том, чтоsum(A) = 0
такSb = [0 0 0 0 0]
. Я попытаюсь изменить ваш алгоритм, чтобы он использовал сумму абсолютных значений коэффициентов, и посмотрим, поможет ли это. Еще раз спасибо за помощь.abs(M)
, то есть ,Sa=abs(M)*ones(N,1); Sb=ones(1,N)*abs(M);
а затем продолжить , как указано выше, но я пока не могу понять , как восстановить знакиSa
,Sb
в конце концов. Я добавил патологический пример, который иллюстрирует проблему в оригинальном вопросе выше.Может быть, я упрощаю проблему, но кажется, что вы могли бы:
Не самый элегантный метод, и, вероятно, есть лучший способ, но он должен работать, довольно прост в реализации и должен быть относительно быстрым для матриц скромного размера.
источник
Другой способ - найти отделимое приближение к вашему ядру и посмотреть, насколько оно близко. Это можно сделать двумя способами: минимизировать : 1) Оптимизация методом грубой силы ; это занимает время ~ сумму, а не произведение их длин 2) для фиксированных и , оптимальный - это просто проекция, поэтому оптимизируйте по очереди.A | A - x ⊗ y ⊗ z | x y z y z x x y z x y z . , ,x⊗y⊗z A |A−x⊗y⊗z|
x y z
y z x x y z x y z ...
(Из приблизительных сверток как сумм отделимых сверток на math.stackexchange.)
источник