Страницы: 1 2 След.
RSS
Приписать к исходной матрице слева столбец из единиц
 
Требуется приписать к исходной матрице слева столбец из единиц.

Нужна формула Excel, возвращающая единый массив, в котором к столбцам исходного диапазона приписан слева столбец из единиц.
Нужная формула будет частью более сложной расчетной формулы, расположенной В ОДНОЙ ЯЧЕЙКЕ и введенной как функция массива.

В файле я привожу возможный вариант формулы массива НА ЛИСТЕ.
В составе более сложной расчетной формулы массива в одной ячейке этот вариант не работает.

Спасибо
Изменено: ken54 - 15.11.2015 10:58:58
 
и какая формула Вам нужна?
пишем 1 в первой ячейке и тянем (двойным щелчком) распространяем.
в чем вопрос?
 
ken54,  зачем вы постоянно мудрите с определениями может так в желтой ячейке
Лень двигатель прогресса, доказано!!!
 
Спасибо всем ответившим. Прошу прощения за, возможно, нечетко сформулированный вопрос.

Речь не о том, чтобы НА ЛИСТЕ приписать к матрице слева столбец из единиц.
Этого нового массива с добавленным слева столбцом из единиц ВООБЩЕ не должно быть НА ЛИСТЕ.
Поэтому, Catboyun, ни о каком протягивании или заполнении по CSE и речи нет.

Выходной массив в файле я привел только для того, чтобы показать, чтО должно образовываться в памяти при вычислении нужной формулы массива, ВВЕДЕННОЙ В ОДНУ ЯЧЕЙКУ.
Он должен образовываться только в формуле, НЕ НА ЛИСТЕ. И использоваться внутри более сложной расчетной формулы массива.
Поэтому у этого выходного массива нет никакого адреса, у него есть только содержимое в том виде, который я показал, то есть число строк – такое же как у исходной матрицы, число столбцов – на один больше, чем у исходной матрицы.

Я привел два простых примера этой "более сложной" расчетной формулы:
{=ЧИСЛСТОЛБ(Нужная формула)}
{=СУММ(Нужная формула)}


Итак, снова вопрос:
Что нужно написать вместо (Нужная формула), ничего не добавляя НА ЛИСТЕ и ссылаясь ТОЛЬКО на исходную матрицу по ее имени, то есть не указывая конкретного адреса.

Спасибо
Изменено: ken54 - 15.11.2015 11:00:10
 
Сергей, Спасибо за попытку.

Ваша формула в желтой ячейке, точнее формула в определении переменной "край" не годится хотя бы потому, что результат – сумма всех чисел в желтой ячейке не совпадает с ожидаемым. Там просто просуммированы все числа исходной матрицы БЕЗ добавленного слева столбца из единиц.
Да его – этого столбца из единиц –  я просто и не нашел в Вашей формуле.
Извините.

Может быть, Вы попробуете взглянуть на мою формулу НА ЛИСТЕ, в которой явным образом к исходной матрице приписывается слева столбец из единиц,  
{=ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3}))}
и подскажете как преобразовать ее в Нужную формулу массива, чтобы ввести ее только В ОДНУ ЯЧЕЙКУ, не получая предварительно выходную матрицу на листе, как в моем файле.

То есть, представьте, что на листе есть ТОЛЬКО исходная матрица и две ячейки с формулами
{=ЧИСЛСТОЛБ(Нужная формула)}
{=СУММ(Нужная формула)}

Что написать вместо (Нужная формула), чтобы получить ожидаемый результат.

Простите за "мудрение".
Изменено: ken54 - 15.11.2015 10:59:54
 
ken54, то, что вы хотите получить, в формульном варианте невозможно.
Если знать конечную задачу, то, возможно есть другие пути ее решения формулами. Или макрос.
 
Цитата
Михаил С. написал: ken54, то, что вы хотите получить, в формульном варианте невозможно.
Спасибо. Это очень ценная информация. Позвольте только уточнить, это Ваше утверждение основано на интуиции или на точном знании.
(Понятно, что не хотелось бы впустую потратить много лишнего времени).
Однако иногда бывает, что то, что казалось невозможным, случается. Так недавно на этом форуме мне помогли составить формулу, которая как раз априори казалась почти невозможной.

Даже вот эта формула, приведенная мной выше
{=ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3}))}
для решения этой же задачи, но НА ЛИСТЕ – то есть с явным созданием рабочей матрицы с приписанным слева к исходной матрице столбцом из единиц – вначале я не представлял, как это можно сделать, однако с помощью знатоков это удалось.

Кстати до сих пор не совсем понимаю, как в ней работает часть
ИНДЕКС(Матрица_исходная;;{0;1;2;3})
Ведь в справке к функции ИНДЕКС написано, что:
Цитата
"Значения аргументов «номер_строки» и «номер_столбца» должны указывать на  ячейку внутри заданного массива; в противном случае функция ИНДЕКС возвращает  значение ошибки #ССЫЛ!.",
а здесь используются четыре разных значения номера столбца {0;1;2;3}, тогда как в заданном массиве – Матрица_исходная – только три столбца. Значит хотя бы один из них выходит за границу заданного массива.

Не нужно каждое предложение отделять пустой строкой [МОДЕРАТОР]
 
ken54, я ваще не понимаю что вы хотите если диапазон который нужно обработать известен тогда нужно задать логический отбор что в нем считаем т.е. логический принцип отбора столбцов и строк
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал: тогда нужно задать логический отбор что в нем считаем т.е. логический принцип отбора столбцов и строк
Конечно. Я именно так – логический отбор – и сделал в формуле массива на листе
{=ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3}))} .

Однако будучи введенной в одну ячейку в составе внешней формулы, например
{=ЧИСЛСТОЛБ(ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3})))}
{=СУММ(ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3})))}

она не работает.
В этом и прошу помощи.
 
ken54, да что за логика то у вашей формулы я не понимаю, покажите в примере нормально без вашей исходной матрицы а именно в файле диапазон исходный и хотя бы цветом выделите что из него нужно посчитать ваше столбец()=мин(столбец()) всегда будет истиной это бредовое условие потому что куда бы вы его не вставили например во второй столбец В оно вернет 2=мин(2) итого 2=2 истина потому что мин из одной цифры это и есть мин
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал:
ваше столбец()=мин(столбец()) всегда будет истиной это бредовое условие
Не могу согласиться. Если это введено как часть формулы массива НА ЛИСТЕ (в моем файле примера в диапазоне P11:S20 – одной общей формулой массива), то
столбец() дает номер текущего столбца,
а мин(столбец()) дает номер первого столбца диапазона, в который введена эта формула массива.
В данном случае в ячейке, например, P11, столбец() равен 16, и мин(столбец()) равен 16, тогда по функции ЕСЛИ туда записывается 1, а вот в ячейке Q11 столбец() равен 17, а мин(столбец()) равен по-прежнему 16 ! и тогда по функции ЕСЛИ туда записывается первый элемент исходной матрицы ИНДЕКС(Матрица_исходная;;1),
Условие СТОЛБЕЦ()=МИН(СТОЛБЕЦ() совершенно не бредовое. Я, признаюсь, был в восторге, когда его придумал. Это ответ на мой более ранний вопрос, как во внутренних ячейках диапазона, в который введена формула массива, указать левый верхний угол этого самого диапазона, в частности, первый столбец этого диапазона.
Да это очень легко проверить. Введите формулу
{=СТОЛБЕЦ()=МИН(СТОЛБЕЦ())} в какой-нибудь диапазон, например, A11:H14 (по CSE, разумеется). И увидите строки
ИСТИНА ЛОЖЬ ЛОЖЬ ЛОЖЬ
Но увы, это решение не годится для формулы массива, вводимой не в диапазон, а в одну ячейку, как мне нужно сейчас.
Спасибо за терпение и понимание.
Изменено: ken54 - 14.11.2015 22:19:22
 
Цитата
ken54 написал: {=СТОЛБЕЦ()=МИН(СТОЛБЕЦ())} в какой-нибудь диапазон, например, A11:H14 (по CSE, разумеется). И увидите строки
ИСТИНА ЛОЖЬ ЛОЖЬ ЛОЖЬ
дак посмотрите через вычисление этот бред когда вычисление формулы показывает 3=3 ЛОЖЬ, вобщем я не понимаю вашей логики чего вы хотите
Лень двигатель прогресса, доказано!!!
 
Цитата
Сергей написал: бред когда вычисление формулы показывает 3=3 ЛОЖЬ,
Да не показывает "3=3 ЛОЖЬ". Посмотрите предыдущий ответ внимательнее, пожалуйста. В моем файле примера формула
{=ЕСЛИ(СТОЛБЕЦ()=МИН(СТОЛБЕЦ());1;ИНДЕКС(Матрица_исходная;;{0;1;2;3}))}
введена в диапазон P11:S20. При этом ее часть
СТОЛБЕЦ()=МИН(СТОЛБЕЦ())
дает истину только в ячейках P11:P20, так как в них СТОЛБЕЦ()=16  и  МИН(СТОЛБЕЦ())=16.
А в остальных ячейках этого диапазона по-прежнему МИН(СТОЛБЕЦ())=16, а  СТОЛБЕЦ()=17 в ячейках Q11:Q20, СТОЛБЕЦ()=18 в ячейках R11:R20, СТОЛБЕЦ()=19 в ячейках S11:S20.

Таким образом, условие
СТОЛБЕЦ()=МИН(СТОЛБЕЦ())
дает ИСТИНА только в ячейках P11:P20, и туда по функции ЕСЛИ записывается столбец из единиц,
а в остальные ячейки – соответствующие элементы исходной матрица по функции ИНДЕКС.
То есть НА ЛИСТЕ – в диапазоне P11:S20 моего файла-примера – задача решена: к исходной матрице слева приписан столбец из единиц.
А требуется сделать это в тексте формулы массива В ОДНОЙ ЯЧЕЙКЕ, а не в диапазоне, например, в ячейках M27 с формулой
{=ЧИСЛСТОЛБ(Нужная формула)}  
и в M29 с формулой
{=СУММ(Нужная формула)}

То есть вопрос, что нужно написать в них вместо слов Нужная формула, используя только имя(диапазон) исходной матрицы, чтобы получить правильный ответ
(в M27 –   4, в M29 –  2239.49)
Еще раз спасибо за терпение.
Изменено: ken54 - 03.12.2015 01:40:43
 
Цитата
Сергей написал: этот бред когда вычисление формулы показывает 3=3 ЛОЖЬ, вобщем я не понимаю вашей логики
Понял, как Вам объяснить логику условия
СТОЛБЕЦ()=МИН(СТОЛБЕЦ())
Введите, пожалуйста, формулу
{=СТОЛБЕЦ()}
в какой-нибудь диапазон, например, A11:D11 (по CSE, разумеется). И увидите строку
1    2    3    4
Теперь введите формулу
{=МИН(СТОЛБЕЦ())}
в диапазон A12:D12 тоже как формулу массива (по CSE, разумеется).  И увидите строку
1    1    1    1
Теперь, введите формулу
{=СТОЛБЕЦ()=МИН(СТОЛБЕЦ())}
в диапазон A13:D13 тоже как формулу массива. И увидите строку
ИСТИНА   ЛОЖЬ   ЛОЖЬ   ЛОЖЬ

Все правильно. Формула МИН(СТОЛБЕЦ()), введенная в диапазон как формула массива, дает номер самого левого столбца этого диапазона, в который она сама введена!
Изменено: ken54 - 03.12.2015 01:40:57
 
ken54 это понятно с формулой массива.
Вы объясните для чего вам столбец из единиц - что вы дальше собираетесь с ним делать?
Уверен, что как писал Михаил С.
Цитата
Если знать конечную задачу, то, возможно есть другие пути ее решения
 
Цитата
Вы объясните для чего вам столбец из единиц - что вы дальше собираетесь с ним делать?
Если знать конечную задачу, то, возможно есть другие пути ее решения
Да это очевидно: рассчитать параметры множественной линейной регрессии методом наименьших квадратов в прямом матричном представлении.
(Ничего смешного – это действительно очевидно, так как это единственный случай во всех различных разделах высшей математики, который мне встретился, когда применяется этот прием – приписать к исходной матрице слева столбец из единиц).

Дело в том, что встроенные в Excel средства – Пакет анализа и функции типа ЛИНЕЙН – работают не более, чем с 16 факторами-регрессорами (по крайней мере в версиях до Office2007), а у меня как минимум десятки факторов (по максимуму – сотни).

Вот для того, чтобы использовать прямое матричное представление метода наименьших квадратов нужно к исходной матрице факторов приписать слева столбец из единиц. Затем эта расширенная слева на один столбец из единиц исходная матрица подается на вход различных формул, каждая из которых реализует расчет какого-либо параметра(ов) множественной линейной регрессии (например, коэффициентов регрессии, стандартных ошибок, остаточной дисперсии и др.)
Почему не годится расчет с построением матрицы с дописанным единичным столбцом НА ЛИСТЕ буквально как в моем файле примера – да потому, что это легко для одного-двух расчетов, а предполагается выполнить расчеты для большого количества подмножеств исходных факторов – столбцов матрицы данных (десятки и сотни расчетов). Каждый раз заводить листы с матрицами с дописанным единичным столбцом, согласитесь, весьма обременительно.
(Кстати с помощью участников форума я уже научился строить сами подматрицы столбцов матрицы данных – по вектору отбора показателей. Теперь надо научиться к каждой такой подматрице приписывать слева столбец из единиц.)

Я не писал ранее об этом, так как полагал, что не нужно задуривать людям голову лишними деталями и отвлекать от самого вопроса –
как внутри формулы массива, размещенной в одной ячейке, приписать слева к исходной матрице – ее основному, а скорее всего и единственному аргументу – столбец из единиц.
Если Вы полагаете, что знание этого может помочь ответить на вопрос, извольте.
Изменено: ken54 - 17.11.2015 18:46:10
 
Мда... Мой совет - переходите на R
F1 творит чудеса
 
Ну что же – этого я и опасался, когда в первоначальном вопросе не сообщал подробностей, для чего это нужно. Народ резко потерял интерес к теме.
Воистину, многие знания – многие скорби и умножающий знание умножает печаль.

Впрочем, мне уже удалось найти решение приведенной мной частной задачи приписывания единичного столбца слева к заданной матрице и именно в виде формулы массива В ОДНОЙ ЯЧЕЙКЕ. Спасибо всем участникам дискуссии.
Но раз это никому более не интересно, что ж ...
 
ken54, не всем, в частности мне, понятна Ваша тема, а тратить значительное время на вникание в неё - непозволительная роскошь. Потому изначально я и не подключался и Вас уже "вели" форумчане. Рад, что Вы нашли решение своей задачи. :)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
впрочем, конечно!

чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
ken54 написал:
мне уже удалось найти решение приведенной мной частной задачи приписывания единичного столбца слева к заданной матрице и именно в виде формулы массива В ОДНОЙ ЯЧЕЙКЕ
Формула массива простая

{=ВЫБОР({1;2;3;4};1;ИНДЕКС(Матрица_исходная;;1);ИНДЕКС(Матрица_исходная;;2);ИНДЕКС(Матрица_исходная;;3))}

Соответственно в проверочных ячейках следует записать

{=ЧИСЛСТОЛБ(ВЫБОР({1;2;3;4};1;ИНДЕКС(Матрица_исходная;;1);ИНДЕКС(Матрица_исходная;;2);ИНДЕКС(Матрица_исходная;;3)))}    и это даст 4,
{=СУММ(ВЫБОР({1;2;3;4};1;ИНДЕКС(Матрица_исходная;;1);ИНДЕКС(Матрица_исходная;;2);ИНДЕКС(Матрица_исходная;;3)))}              и это даст 2239.49

Основной, и для меня достаточно серьезный, недостаток этого решения в том, что это решение действительно ТОЛЬКО ЧАСТНОЙ ЗАДАЧИ – структура формулы хотя и не содержит ни адреса исходной матрицы, ни числа ее строк, но явным образом использует число столбцов этой матрицы.
Поэтому общее решение, по-видимому, требует текстовой формулы для нужного числа повторений элемента ";ИНДЕКС(Матрица_исходная;;1)" да еще и с изменяемым номером столбца в каждом повторении.
Буду признателен за любые предложения по доработке.
 
ken54, я смутно понимаю, но может угадал. Формула массивная:
=ЕСЛИ(СТОЛБЕЦ(ДВССЫЛ("1:"&ЧИСЛСТОЛБ(Матрица_исходная)+1))=1;1;ИНДЕКС(Матрица_исходная;СТРОКА(ДВССЫЛ("1:"&ЧСТРОК(Матрица_исходная)));СТОЛБЕЦ(ДВССЫЛ("1:"&ЧИСЛСТОЛБ(Матрица_исходная)+1))-1))

Размеры матрицы берутся из размера именованного диапазона Матрица_исходная.
Изменено: JayBhagavan - 18.11.2015 13:07:55

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,Спасибо за попытку.
Как формула массива НА ЛИСТЕ Ваша формула вполне работает. Однако если подставить ее в проверочные ячейки
M27 с формулой
{=ЧИСЛСТОЛБ(Нужная формула)}
и в M29 с формулой
{=СУММ(Нужная формула)}
вместо слов Нужная формула,
то ЧИСЛСТОЛБ дает 256,
а СУММ – #Н/Д.
Буду разбираться.
 
Для указанных Вами подсчётов:
=ЧИСЛСТОЛБ(Матрица_исходная)+1
=СУММ(Матрица_исходная)+ЧСТРОК(Матрица_исходная)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Спасибо, что откликнулись

Вопрос же не в том, чтобы получить эти два числа – эти две проверочные формулы я предложил только для того, чтобы убедиться, что основная Нужная формула массива будет работать не только НА ЛИСТЕ, но и будучи введенной как часть более сложной формулы массива В ОДНУ ЯЧЕЙКУ.
(Как я писал ранее, это будут расчеты параметров множественной линейной регрессии. Там эту матрицу придется транспонировать, умножать, инвертировать и т.д.)

Таким образом, в случае Вашей формулы все было бы хорошо, если бы подставив ее в
{=ЧИСЛСТОЛБ(Нужная формула)}
ВМЕСТО слов Нужная формула
то есть введя в ячейку
{=ЧИСЛСТОЛБ(ЕСЛИ(СТОЛБЕЦ(ДВССЫЛ("1:"&ЧИСЛСТОЛБ(Матрица_исходная)+1))=1;1;ИНДЕКС(Матрица_исходная;СТРОКА(ДВССЫЛ("1:"&ЧСТРОК(Матрица_исходная)));СТОЛБЕЦ(ДВССЫЛ("1:"&ЧИСЛСТОЛБ(Матрица_исходная)+1))-1)))}

мы получали бы правильный ответ.
Увы...Представленное выражение дает число 256. Пока, правда, я не разобрался, почему.  
 
УДФ

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Спасибо,  JayBhagavan,  только вернулся к машине, не сразу ответил.

Боюсь сглазить, но похоже, что это то, что нужно. Хотя и не формула (как было в первоначальном вопросе), а функция, но так, насколько я понимаю, даже лучше – нечаянно испортить на листе сложнее, да и считает быстрее.

Спасибо, за помощь. Буду разбираться.
 
ken54, пожалуйста. Функцию можете модифицировать, например, добавив параметры: что добавить, в строку/столбец, сколько строк/столбцов, слева/справа/сверху/снизу и т.д.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Если позволите, JayBhagavan, один вопрос по Вашей функции.

Не будет ли лучше (и считать быстрее), если избежать проверки по IF на каждом шаге присвоения (число раз выполнения IF здесь равно числу строк, умноженному на число столбцов новой матрицы), а вынести присвоение единиц из внутреннего цикла непосредственно во внешний, и начать внутренний сразу с 2-х?
То есть, примерно так
Код
Function arr_plus(arr As Range)
Dim arr_tmp, arr_new(), i&, j&
    arr_tmp = arr.Value
    ReDim arr_new(1 To UBound(arr_tmp, 1), 1 To UBound(arr_tmp, 2) + 1)
    For i = 1 To UBound(arr_new, 1)
        arr_new(i, 1) = 1
        For j = 2 To UBound(arr_new, 2)
            arr_new(i, j) = arr_tmp(i, j - 1)
        Next j
    Next i
    arr_plus = arr_new
End Function

Простите, модератор, не знаю, как сделать удобную вкладку.
Изменено: ken54 - 19.11.2015 12:51:49
 
JayBhagavan, 2-й вопрос, если позволите, по-видимому, вызван недостаточным знакомством с VBA:
Зачем нужен временный массив arr_tmp? Почему нельзя везде, где он используется, сразу поставить массив arr – аргумент функции?

То есть сделать так
Код
Function arr_plus(arr As Range)
Dim arr_new(), i&, j&
    ReDim arr_new(1 To UBound(arr, 1), 1 To UBound(arr, 2) + 1)
    For i = 1 To UBound(arr_new, 1)
        arr_new(i, 1) = 1
        For j = 2 To UBound(arr_new, 2)
            arr_new(i, j) = arr(i, j - 1)
        Next j
    Next i
    arr_plus = arr_new
End Function
Аналогичный вопрос возникает и по поводу массива arr_new, зачем он нужен. Но тут, я подозреваю, дело в том, что Вы не хотите в теле функции "трогать" ее имя, вводя его в программу непосредственно перед выходом. Но что это дает кроме расхода лишней памяти?
Изменено: ken54 - 19.11.2015 21:14:31
Страницы: 1 2 След.
Читают тему
Наверх