Excel vs. MatLab
Jan. 16th, 2006 02:50 pmПонадобилось посчитать на Excel сумму всех положительных чисел колонки. И вот тут-то и увидел принципиальную разницу %subj%.
Грубо говоря, если на Excel написать =Sum (Iif (range > 0; range; 0)), то вылезает ошибка. Функция Iif работает только со скалярами, а я ей подсовываю матрицу, и хочу матрицу в ответ. В то время как MatLab, рассматривающий скаляры, как матрицы 1*1, успешно проглатывает аналогичное выражение.
FYI: У Excel есть-таки хитрость, позволяющая применить скалярную функцию поэлементно к матрице. Набрав указанную формулу, нужно нажать не Enter, а Ctrl-Shift-Enter, тогда формула будет восприниматься как матричная. Т.е. именно то, что
genem называл коралловым островом: при отсутствии "правильной" архитектуры разработчики начинают залатывать дыры с помощью хитрых кнопочек, дополнительных функций, которые друг с другом рано или поздно начинают конфликтовать. Что лечится новыми специальными кнопочками, и т.д., и т.п.
Грубо говоря, если на Excel написать =Sum (Iif (range > 0; range; 0)), то вылезает ошибка. Функция Iif работает только со скалярами, а я ей подсовываю матрицу, и хочу матрицу в ответ. В то время как MatLab, рассматривающий скаляры, как матрицы 1*1, успешно проглатывает аналогичное выражение.
FYI: У Excel есть-таки хитрость, позволяющая применить скалярную функцию поэлементно к матрице. Набрав указанную формулу, нужно нажать не Enter, а Ctrl-Shift-Enter, тогда формула будет восприниматься как матричная. Т.е. именно то, что
no subject
Date: 2006-01-16 03:05 pm (UTC)no subject
Date: 2006-01-16 03:20 pm (UTC)no subject
Date: 2006-01-16 03:23 pm (UTC)no subject
Date: 2006-01-16 03:33 pm (UTC)Я писал, что при всём при этом, у самого Excel логика иногда "правильная", т.е. класс Range покрывает все возможные в Excel виды матриц: 1*1, 1*N, N*1 и N*M. И все изначально матричные функции (типа Sum) правильно работают и со "скалярами".
А вот обратное - неверно.
Смотри, в моём примере, у меня есть некая матрица X из 1*N эледентов (моя колонка). Я хочу с ней сделать следующее:
1. Y = Iif (X > 0; X; 0), т.е. сделать матрицу Y того же размера, где Y(i) = Iif (X(i) > 0; X(i); 0). Т.е. оставляю все положительные числа, а на места отрицательных ставлю 0.
2. Z = Sum(Y), т.е. то, что мне надо - число, равное сумме всех положительных чисел столбца.
Всё круто, только п.1 не работает. Именно потому, что скалярные функции не применяются к матрицам. Если не учитывать описанной хитрости Ctrl-Shift-Enter.
no subject
Date: 2006-01-16 03:37 pm (UTC)А п.1 сам по себе решается копированием формулы, например.
no subject
Date: 2006-01-16 03:56 pm (UTC)Копированием формулы, в смысле, сделать рядом ещё одну колонку, в которой будет мой Iif, а потом её просуммировать? Некрасиво. У меня огромная простыня, несколько десятков колонок, я к каждой должен по паре "системных" приписать?
no subject
Date: 2006-01-16 04:08 pm (UTC)Некрасиво, согласна, особенно при больших размерах исходных матриц.
no subject
Date: 2006-01-16 04:22 pm (UTC)Там же фишка ещё и в том, что ты можешь написать сама свои функции, и вставлять их в стандартные формулы. Но при этом нет (я по крайней мере не знаю) возможности писать матричные функции.
no subject
Date: 2006-01-16 04:44 pm (UTC)no subject
Date: 2006-01-17 08:43 am (UTC)no subject
Date: 2006-01-16 07:14 pm (UTC)(Вообще-то нормальный IF делает всё, что надо, описанным тобою способом...)
no subject
Date: 2006-01-17 08:49 am (UTC)no subject
Date: 2006-01-18 10:36 pm (UTC)1. Суперчайники. "А что такое эксель?"
2. Чайиники. "А что такое SUMIF?"
3. Продвинутые. "Заводим новую колонку, где конкатениируем все критерии в одну строку, затем запускаем SUMIF с одним критерием, равным конкатенации критериев".
4. Профи. "Cntrl-shift-enter" и легкая ухмылка в адрес всех предыдущих.
no subject
Date: 2006-01-19 08:47 am (UTC)