Ich möchte schnell feststellen können, ob ein gegebener 2D-Kern mit ganzzahligen Koeffizienten in zwei 1D-Kernel mit ganzzahligen Koeffizienten zerlegbar ist. Z.B
2 3 2
4 6 4
2 3 2
ist trennbar in
2 3 2
und
1
2
1
Der eigentliche Test der Trennbarkeit scheint mit Integer-Arithmetik recht einfach zu sein, die Zerlegung in 1D-Filter mit Integer-Koeffizienten erweist sich jedoch als schwieriger. Die Schwierigkeit scheint in der Tatsache zu liegen, dass Verhältnisse zwischen Zeilen oder Spalten nicht ganzzahlig sein können (rationale Brüche), z. B. haben wir im obigen Beispiel Verhältnisse von 2, 1/2, 3/2 und 2/3.
Ich möchte nicht wirklich einen Hochleistungsansatz wie SVD verwenden, weil (a) er für meine Bedürfnisse relativ rechenintensiv ist und (b) es immer noch nicht unbedingt hilft, ganzzahlige Koeffizienten zu bestimmen .
Irgendwelche Ideen ?
WEITERE INFORMATIONEN
Koeffizienten können positiv, negativ oder null sein, und es kann pathologische Fälle geben, in denen die Summe eines oder beider 1D-Vektoren null ist, z
-1 2 -1
0 0 0
1 -2 1
ist trennbar in
1 -2 1
und
-1
0
1
quelle
Antworten:
Ich habe die
@Phonon
Antwort genommen und etwas modifiziert, so dass der GCD-Ansatz nur für die obere Zeile und die linke Spalte und nicht für Zeilen- / Spaltensummen verwendet wird. Dies scheint pathologische Fälle etwas besser zu behandeln. Es kann immer noch fehlschlagen, wenn die obere Zeile oder die linke Spalte Nullen sind. Diese Fälle können jedoch überprüft werden, bevor diese Methode angewendet wird.Vielen Dank
@Phonon
und@Jason R
für die originellen Ideen dazu.quelle
Ich habs! Das Posten von MATLAB-Code wird heute Abend oder morgen eine Erklärung veröffentlichen
quelle
A=[-2 1 0 -1 2]; B=[2 -3 6 0 -1]; M=A'*B;
. Das Problem hier ist dassum(A) = 0
soSb = [0 0 0 0 0]
. Ich werde versuchen, Ihren Algorithmus so zu ändern, dass er die Summe der absoluten Werte der Koeffizienten verwendet, und prüfen, ob dies hilft. Danke nochmal für deine Hilfe.abs(M)
, das heißtSa=abs(M)*ones(N,1); Sb=ones(1,N)*abs(M);
und dann weiter wie oben, aber ich kann noch nicht sehen , wie die Zeichen wiederherzustellenSa
,Sb
am Ende. Ich habe ein pathologisches Beispiel hinzugefügt, das das Problem in der ursprünglichen Frage oben veranschaulicht.Vielleicht verharmlost ich das Problem, aber es sieht so aus, als könntest du:
Nicht die eleganteste Methode, und es gibt wahrscheinlich einen besseren Weg, aber es sollte funktionieren, ist ziemlich einfach zu implementieren und sollte für Matrizen mit bescheidener Größe relativ schnell sein.
quelle
(Aus der ungefähren Faltung als Summe trennbarer Faltungen in math.stackexchange.)
quelle