Сумма длинных векторов в SQL - PullRequest
1 голос
/ 16 ноября 2011

Я знаю, что в SQL легко вычислить произведение разреженных точек, но как лучше всего сложить сумму (для очень длинных векторов)?

Объединения недостаточно, потому что если координатазаполненный одним вектором, но не другим, он будет игнорироваться.

Таким образом, я вычислил сумму с помощью цикла PHP ... и это была довольно глупая идея.

I 'В настоящее время я думаю о заполнении недостающих 0, чтобы подготовить внутреннее соединение, но есть ли ярлык (например, внешнее соединение, преобразующее NULL в 0)?

Edit. Вот структурамоей таблицы векторов:

CREATE TABLE `eigaki_vectors` (
  `name` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
  `i1` int(10) NOT NULL,
  `i2` int(10) NOT NULL,
  `value` double NOT NULL,
  UNIQUE KEY `key` (`name`,`i1`,`i2`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

В данном конкретном случае вектор состоит из индексов: v_{i_1, i_2}, но это не имеет ничего общего с проблемой.

Я ожидал сделатьчто-то вроде (спасибо xQbert):

SELECT v1.i1, v1.i2, isNull(v1.value, 0) + isNull(v2.value, 0)
FROM eigaki_vectors v1 FULL OUTER JOIN eigaki_vectors v2
ON v1.i1 = v2.i1 AND v1.i2 = v2.i2
AND v1.name = 'a' AND v2.name = 'b'

для добавления векторов a и b.Но FULL OUTER JOIN не существует на MySQL, и я думаю, что я неуклюж с колонкой name.Есть идеи?

Ответы [ 2 ]

1 голос
/ 17 ноября 2011

Мне удалось получить что-то, благодаря фрагменту, предоставленному в MySQL: Союз левого соединения с правым соединением :

SELECT IFNULL(v1.value, 0) + IFNULL(v2.value, 0) FROM
(
    SELECT i1, i2 FROM eigaki_vectors WHERE name = 'a'
    UNION
    SELECT i1, i2 FROM eigaki_vectors WHERE name = 'b'
) indices
LEFT OUTER JOIN eigaki_vectors v1 ON indices.i1 = v1.i1 AND indices.i2 = v1.i2 AND v1.name = 'a'
LEFT OUTER JOIN eigaki_vectors v2 ON indices.i1 = v2.i1 AND indices.i2 = v2.i2 AND v2.name = 'b'
1 голос
/ 16 ноября 2011
coalesce(Field,OtherField, AnotherField,0)

coalesce - это в общем случае if тогда forever ... он выбирает первое ненулевое значение из вашего списка переменных

isNull делает то же самое, но только для 2 значений

isNull(Field,0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...