Je voudrais pouvoir déterminer rapidement si un noyau 2D donné de coefficients entiers est séparable en deux noyaux 1D avec des coefficients entiers. Par exemple
2 3 2
4 6 4
2 3 2
est séparable en
2 3 2
et
1
2
1
Le test réel de séparabilité semble être assez simple en utilisant l'arithmétique entière, mais la décomposition en filtres 1D avec des coefficients entiers s'avère être un problème plus difficile. La difficulté semble résider dans le fait que les ratios entre les lignes ou les colonnes peuvent être non entiers (fractions rationnelles), par exemple dans l'exemple ci-dessus, nous avons des ratios de 2, 1/2, 3/2 et 2/3.
Je ne veux pas vraiment utiliser une approche lourde comme SVD parce que (a) c'est relativement coûteux en calcul pour mes besoins et (b) ça n'aide pas toujours nécessairement à déterminer des coefficients entiers .
Des idées ?
PLUS D'INFORMATIONS
Les coefficients peuvent être positifs, négatifs ou nuls, et il peut y avoir des cas pathologiques où la somme de l'un ou des deux vecteurs 1D est nulle, par exemple
-1 2 -1
0 0 0
1 -2 1
est séparable en
1 -2 1
et
-1
0
1
la source
Réponses:
J'ai pris
@Phonon
la réponse de et l ' ai quelque peu modifiée pour qu'elle utilise l' approche GCD uniquement sur la ligne du haut et la colonne de gauche, plutôt que sur les sommes de ligne / colonne. Cela semble mieux gérer les cas pathologiques. Il peut toujours échouer si la ligne supérieure ou la colonne de gauche sont toutes des zéros, mais ces cas peuvent être vérifiés avant d'appliquer cette méthode.Un grand merci à
@Phonon
et@Jason R
pour les idées originales pour cela.la source
Je l'ai! Publication du code MATLAB, affichera une explication ce soir ou demain
la source
A=[-2 1 0 -1 2]; B=[2 -3 6 0 -1]; M=A'*B;
. Le problème ici est quesum(A) = 0
ouiSb = [0 0 0 0 0]
. Je vais essayer de modifier votre algorithme pour qu'il utilise la somme des valeurs absolues des coefficients et voir si cela aide. Merci encore pour votre aide.abs(M)
, par exempleSa=abs(M)*ones(N,1); Sb=ones(1,N)*abs(M);
, puis continuer comme ci - dessus, mais je ne peux encore voir comment restaurer les panneauxSa
,Sb
à la fin. J'ai ajouté un exemple pathologique qui illustre le problème dans la question d'origine ci-dessus.Peut-être que je banalise le problème, mais il semble que vous pourriez:
Ce n'est pas la méthode la plus élégante, et il y a probablement une meilleure façon, mais cela devrait fonctionner, est assez simple à implémenter et devrait être relativement rapide pour les matrices de taille modeste.
la source
(De approximative-a-convolution-as-a-sum-of-separable-convolutions sur math.stackexchange.)
la source