Практическая задача на умножение матриц - разрешима?
От: Shmj Ниоткуда  
Дата: 23.11.19 20:43
Оценка:
Никогда не думал что дойду до такой жизни, что на практике понадобилось умножение матриц.

Кто забыл как умножать: https://ru.onlinemschool.com/math/assistance/matrix/multiply/

В общем, есть такая штука как преобразование цветов, скорее всего на уровне видеокарты. Цвет представляется в виде матрицы 1*5:

[R, G, B, A, 255]

R, G, B — это цвета, значение от 0 до 255. A — прозрачность, мы не трогаем — всегда 255. И последнее — константа, ее добавили для расширения возможностей преобразования.

Матрица, на которую умножают эту — 5*5. Там можно писать любые числа, чтобы получить из входящих цветов нужные нам исходящие. Если в результате проеобразования занчение меньше 0, то на выходе будет 0. Если больше 255 — на выходе 255.

Задача: если все цвета R, G, B более некой константы, к примеру более 100, то на выходе должно быть 0, 0, 0. Если меньше 100, то на выходе должно быть 255, 255, 255. Т.е., грубо говоря, все светлые пикселы должны стать черными а все темные — белыми.

Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?
Отредактировано 23.11.2019 20:44 Shmj . Предыдущая версия .
Re: Практическая задача на умножение матриц - разрешима?
От: LuciferSaratov Россия  
Дата: 24.11.19 03:39
Оценка: 10 (1) +2
S>Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?

Нет.
Любая матрица описывает непрерывную функцию, что очевидно.
Функция, о которой говоришь ты, имеет разрыв.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Muxa  
Дата: 24.11.19 10:06
Оценка: +2
LS>Любая матрица описывает непрерывную функцию, что очевидно.
LS>Функция, о которой говоришь ты, имеет разрыв.

Ну, откуда ж ему об этом было знать?
По его ссылке этого не написано, и профильного образования у него нет. Вот и вся суть самоучек.
Re: Практическая задача на умножение матриц - разрешима?
От: kov_serg Россия  
Дата: 24.11.19 11:17
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>Матрица, на которую умножают эту — 5*5. Там можно писать любые числа, чтобы получить из входящих цветов нужные нам исходящие. Если в результате проеобразования занчение меньше 0, то на выходе будет 0. Если больше 255 — на выходе 255.


S>Задача: если все цвета R, G, B более некой константы, к примеру более 100, то на выходе должно быть 0, 0, 0. Если меньше 100, то на выходе должно быть 255, 255, 255. Т.е., грубо говоря, все светлые пикселы должны стать черными а все темные — белыми.


S>Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?


Элементарно.
Но надо 2 преобразования
1. сдвигаем на S=-100
[1,0,0,0,S]
[0,1,0,0,S]
[0,0,1,0,S]
[0,0,0,1,0]
[0,0,0,0,1]
2. умножаем на K=255
[K,0,0,0,0]
[0,K,0,0,0]
[0,0,K,0,0]
[0,0,0,K,0]
[0,0,0,0,1]
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Muxa  
Дата: 24.11.19 11:27
Оценка:
_>Элементарно.
_>Но надо 2 преобразования
_>1. сдвигаем на S=-100
_>2. умножаем на K=255
это ты все светлые пиксели сделал белыми, а темные — черными. а нужно наоборот.
не хватает двух действий: домножить на -1, и прибавить 255
Re: Практическая задача на умножение матриц - разрешима?
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.11.19 12:23
Оценка: 10 (1)
Здравствуйте, Shmj, Вы писали:

S>Задача: если все цвета R, G, B более некой константы, к примеру более 100, то на выходе должно быть 0, 0, 0. Если меньше 100, то на выходе должно быть 255, 255, 255. Т.е., грубо говоря, все светлые пикселы должны стать черными а все темные — белыми.


S>Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?


Нет. С помощью умножения матриц можно сделать линейные преобразования. Напомню, функция f(x) называется линейной, если для любых x и y врдно равенство: f(x+y) == f(x) + f(y).

Преобразование, которое ты хочешь получить, линейным не является. Поэтому с помощью умножения матриц его сделать не получится.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.11.19 12:24
Оценка: +1
Здравствуйте, LuciferSaratov, Вы писали:

S>>Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?


LS>Любая матрица описывает непрерывную функцию, что очевидно.


Линейную. Поэтому параболу тоже не построишь, хоть она и непрерывна.
Re[3]: Практическая задача на умножение матриц - разрешима?
От: LuciferSaratov Россия  
Дата: 24.11.19 13:10
Оценка:
Pzz>Линейную. Поэтому параболу тоже не построишь, хоть она и непрерывна.

спору нет.
однако мне для доказательства невозможности достаточно было опереться на свойство непрерывности.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Mystic Artifact  
Дата: 24.11.19 14:00
Оценка:
Здравствуйте, Pzz, Вы писали:

Тогда бы напомнили заодно об однородности линейных функций.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: samius Россия http://sams-tricks.blogspot.com
Дата: 24.11.19 16:10
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Нет. С помощью умножения матриц можно сделать линейные преобразования.

Линейные сделать можно, но не только лишь их. Есть еще и нелинейные. Перспективные, например, выходят из класса линейных, но тоже описываются матрицей.
Re[3]: Практическая задача на умножение матриц - разрешима?
От: kov_serg Россия  
Дата: 24.11.19 17:57
Оценка:
Здравствуйте, Muxa, Вы писали:

M>это ты все светлые пиксели сделал белыми, а темные — черными. а нужно наоборот.

M>не хватает двух действий: домножить на -1, и прибавить 255
Это не важно
можно и наоборот
[-1, 0, 0, 0,100]
[ 0,-1, 0, 0,100]
[ 0, 0,-1, 0,100]
[ 0, 0, 0, 1,  0]
[ 0, 0, 0, 0,  1]

А потом растянуть
[255,  0,  0,  0,  0]
[  0,255,  0,  0,  0]
[  0,  0,255,  0,  0]
[  0,  0,  0,  1,  0]
[  0,  0,  0,  0,  1]
Re: Практическая задача на умножение матриц - разрешима?
От: Ночной Смотрящий Россия  
Дата: 24.11.19 20:28
Оценка: :)))
Здравствуйте, Shmj, Вы писали:

S>Разрешима ли эта задача с помощью умножения матриц? И каков ход ваших мыслей, чтобы понять как ее решить?


Ну вот ты и сдулся, дворовый, блин, боец.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Shmj Ниоткуда  
Дата: 24.11.19 22:58
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Элементарно.


Ваш оптимизм мне нравится Все говорят нельзя, вы предлагаете решение.

Вот тут код, можно проверить как работают ваши матрицы: https://dotnetfiddle.net/uWAite

В методе Test2 вводите цвет вот здесь:

Color fromColor = Color.FromArgb(1, 1, 1);


Нажимаете на стрелочку — и получите цвет вашего преобразования (вторая строчка внизу, после 0,255,255). Test1 — это инверсия, чтобы знать что код преобразования работает.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Shmj Ниоткуда  
Дата: 24.11.19 23:02
Оценка: :)
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Ну вот ты и сдулся, дворовый, блин, боец.


Почему сдулся? Я привык обкашлять тему, прежде чем вникать. Даже если выставлю себя дураком — это не важно для меня.

Уже понятно что умножение матриц мне не понадобится, скорее всего никогда в жизни. Так, ради любопытства ковыряю.
Re[4]: Практическая задача на умножение матриц - разрешима?
От: agp  
Дата: 25.11.19 01:26
Оценка:
Здравствуйте, kov_serg, Вы писали:

Зачем два преобразования? Перемножаем вторую на первую, и вуаля же:

[-255, 0, 0, 0, 25500]
[0, -255, 0, 0, 25500]
[0, 0, -255, 0, 25500]
[0, 0, 0, 1, 0]
[0, 0, 0, 0, 1]

_>Это не важно

_>можно и наоборот
_>
_>[-1, 0, 0, 0,100]
_>[ 0,-1, 0, 0,100]
_>[ 0, 0,-1, 0,100]
_>[ 0, 0, 0, 1,  0]
_>[ 0, 0, 0, 0,  1]
_>

_>А потом растянуть
_>
_>[255,  0,  0,  0,  0]
_>[  0,255,  0,  0,  0]
_>[  0,  0,255,  0,  0]
_>[  0,  0,  0,  1,  0]
_>[  0,  0,  0,  0,  1]
_>
Re[3]: Практическая задача на умножение матриц - разрешима?
От: Ночной Смотрящий Россия  
Дата: 25.11.19 07:15
Оценка: +1 :)
Здравствуйте, Shmj, Вы писали:

S>Почему сдулся? Я привык обкашлять тему, прежде чем вникать.


Пока ты обкашливаешь нормальные разработчики уже давно сдали работу.

S> Даже если выставлю себя дураком — это не важно для меня.


Что то не знать — восе не означает быть дураком. Быть дураком это когда не знать и гордиться этим.

S>Уже понятно что умножение матриц мне не понадобится, скорее всего никогда в жизни. Так, ради любопытства ковыряю.


Остальным кое что другое понятно, но ты оставайся в зоне комфорта.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Практическая задача на умножение матриц - разрешима?
От: Shmj Ниоткуда  
Дата: 25.11.19 13:33
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>Почему сдулся? Я привык обкашлять тему, прежде чем вникать.

НС>Пока ты обкашливаешь нормальные разработчики уже давно сдали работу.

На самом деле разработка — дело довольно гибкое. Матрица преобразования мне ничем не помогла — применил друго вариант.

Таких вещей, которые нужно исследовать — не много, спешки особой нет.
Re[2]: Практическая задача на умножение матриц - разрешима?
От: Erop Россия  
Дата: 25.11.19 13:56
Оценка: +2
Здравствуйте, Pzz, Вы писали:

Pzz>Нет. С помощью умножения матриц можно сделать линейные преобразования. Напомню, функция f(x) называется линейной, если для любых x и y врдно равенство: f(x+y) == f(x) + f(y).


Pzz>Преобразование, которое ты хочешь получить, линейным не является. Поэтому с помощью умножения матриц его сделать не получится.

У него умножение с насыщением, так что нифига не линейные...

Вот смотри, если бы канал был один, то берём матрицу, в которой на диагонали -256, а в правом столбце (который на 255 домножают) пишем 25600/255.
Соответственно для чисел меньше или равно 100 получим +больше255, а для больше -- меньше 0, что с насыщением даст нужное поведение.

Но вопрос всё равно не тривиальный, так как канала три...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Практическая задача на умножение матриц - разрешима?
От: Erop Россия  
Дата: 25.11.19 13:58
Оценка:
Здравствуйте, samius, Вы писали:

S>Линейные сделать можно, но не только лишь их. Есть еще и нелинейные. Перспективные, например, выходят из класса линейных, но тоже описываются матрицей.

Там операция другая
1. Нет насыщения
2. делят на последний канал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Практическая задача на умножение матриц - разрешима?
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.11.19 13:59
Оценка:
Здравствуйте, Erop, Вы писали:

Pzz>>Преобразование, которое ты хочешь получить, линейным не является. Поэтому с помощью умножения матриц его сделать не получится.

E>У него умножение с насыщением, так что нифига не линейные...

Если с насыщением, то да. А что, оно просто все, что больше 255, считает равным 255?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.