green_fr: (Default)
[personal profile] green_fr
Понадобилось посчитать на Excel сумму всех положительных чисел колонки. И вот тут-то и увидел принципиальную разницу %subj%.
Грубо говоря, если на Excel написать =Sum (Iif (range > 0; range; 0)), то вылезает ошибка. Функция Iif работает только со скалярами, а я ей подсовываю матрицу, и хочу матрицу в ответ. В то время как MatLab, рассматривающий скаляры, как матрицы 1*1, успешно проглатывает аналогичное выражение.

FYI: У Excel есть-таки хитрость, позволяющая применить скалярную функцию поэлементно к матрице. Набрав указанную формулу, нужно нажать не Enter, а Ctrl-Shift-Enter, тогда формула будет восприниматься как матричная. Т.е. именно то, что [livejournal.com profile] genem называл коралловым островом: при отсутствии "правильной" архитектуры разработчики начинают залатывать дыры с помощью хитрых кнопочек, дополнительных функций, которые друг с другом рано или поздно начинают конфликтовать. Что лечится новыми специальными кнопочками, и т.д., и т.п.

Date: 2006-01-16 03:05 pm (UTC)
From: [identity profile] dalvadorez.livejournal.com
Стоп. Ничего не поняла. Все-таки колонки или матрицы?

Date: 2006-01-16 03:20 pm (UTC)
From: [identity profile] green-fr.livejournal.com
После MatLab, колонка - это такая же матрица (одномерная), как и "обычная" (двухмерная) и все остальные <a href="http://www.livejournal.com/users/green_fr/16429.html>целые размерности</a> :-Р Это, кстати, хорошо видно даже в архитектуре Excel. У них есть единственный класс Range, который отвечает и за отдельные ячейки, и за колонки, и за строчки, и за "матрицы". Более того, "матричные" функции (типа той же Sum) можно применить ко всем этим элементам, и ответ будет ожидаемый. Замеченная "бага" - это то, что наоборот не работает. Т.е. изначально предназначенная для скаляров функция (Iif, Sin, Cos и т.п.) просто так с матрицей не работает. Тогда как в MatLab можно написать A = sin(B), где B - 4-мерная матрица 2-5-8-2 и получить точно такого же размера матрицу A, в каждой ячейке которой будет синус соответствующего элемента B. А если B - "число", то и A будет "числом".

Date: 2006-01-16 03:23 pm (UTC)
From: [identity profile] dalvadorez.livejournal.com
Тогда почему на выходе ты хочешь матрицу?? Если тебе сумма всех неотрицательных чисел матрицы=число нужна?

Date: 2006-01-16 03:33 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Ой, я тебе тут гораздо больше писал, потерялось всё куда то...
Я писал, что при всём при этом, у самого 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.

Date: 2006-01-16 03:37 pm (UTC)
From: [identity profile] dalvadorez.livejournal.com
Чем тебе вместо двух пунктов SUMIF не угодил?

А п.1 сам по себе решается копированием формулы, например.

Date: 2006-01-16 03:56 pm (UTC)
From: [identity profile] green-fr.livejournal.com
Я не знал о его существовании. Но это и есть ещё одна заплатка - а если мне сумму синусов надо - требовать функцию SUMSIN от разработчиков?

Копированием формулы, в смысле, сделать рядом ещё одну колонку, в которой будет мой Iif, а потом её просуммировать? Некрасиво. У меня огромная простыня, несколько десятков колонок, я к каждой должен по паре "системных" приписать?

Date: 2006-01-16 04:08 pm (UTC)
From: [identity profile] dalvadorez.livejournal.com
А я не знала, что такое IIF (и так пока и не узнала - в хелпе только IF. где искать?).

Некрасиво, согласна, особенно при больших размерах исходных матриц.

Date: 2006-01-16 04:22 pm (UTC)
From: [identity profile] green-fr.livejournal.com
У меня в Help есть :-)
Там же фишка ещё и в том, что ты можешь написать сама свои функции, и вставлять их в стандартные формулы. Но при этом нет (я по крайней мере не знаю) возможности писать матричные функции.

Date: 2006-01-16 04:44 pm (UTC)
From: [identity profile] dalvadorez.livejournal.com
Наверное, у нас разные Эксели :)

Date: 2006-01-17 08:43 am (UTC)
From: [identity profile] green-fr.livejournal.com
Эта функция сидит в VBA с 97-й версии точно. Просто help может быть разный, по умолчанию VBA Help не ставится, его нужно отдельно было выделять при инсталляции.

Date: 2006-01-16 07:14 pm (UTC)
From: [identity profile] bgmt.livejournal.com
А всё-таки что такое IIF - ты уклоняешься от ответа?
(Вообще-то нормальный IF делает всё, что надо, описанным тобою способом...)

Date: 2006-01-17 08:49 am (UTC)
From: [identity profile] green-fr.livejournal.com
IIF(a, b, c) - это функция VBA, которая интерпретируется как "Если a, то b, иначе c". Но я же не о какой-то конкретной функции говорю (кстати, как это делается простым IF, расскажи), а о принципе. Ты написал некоторую функцию. И она получается принципиально скалярной (ну, я не знаю, как её сделать матричной). Жаль. Пост об этом, а не как просуммировать положительные числа :-)

Date: 2006-01-18 10:36 pm (UTC)
From: [identity profile] pavel-s.livejournal.com
В принципе, знакомая всем проблема - как посчитать SUMIF по количеству критериев больше, чем 1. Стандартный SUMIF суммирует только по одному критерию. А если мне нужно просуммировать значения из колонки А, если значение в колонке В=х, а в колонке С=у. Тут все пользователи делятся на следующие категории
1. Суперчайники. "А что такое эксель?"
2. Чайиники. "А что такое SUMIF?"
3. Продвинутые. "Заводим новую колонку, где конкатениируем все критерии в одну строку, затем запускаем SUMIF с одним критерием, равным конкатенации критериев".
4. Профи. "Cntrl-shift-enter" и легкая ухмылка в адрес всех предыдущих.

Date: 2006-01-19 08:47 am (UTC)
From: [identity profile] green-fr.livejournal.com
И всё это вместо того, чтобы написать простенький цикл на VBA? :-Р

Profile

green_fr: (Default)
green_fr

December 2025

S M T W T F S
 1 2 3 4 56
7 8 9 10 11 1213
14 15 16 17 18 1920
212223242526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 5th, 2026 03:56 am
Powered by Dreamwidth Studios