Я создаю матрицу с помощью «MAKEARRAY» и хотел бы восстановить подматрицу этой матрицы. Я думал об использовании «СМЕЩА», но, видимо, он работает только в диапазоне или ячейке.
Я попробовал это:
=LET(data;MAKEARRAY(2;2;LAMBDA(row;col;row+col));OFFSET(data;;;1;1))
Но в результате я получаю «#value» (это вполне нормально, потому что мы не можем использовать OFFSET с матрицей) Офсетная документация
Если вы хотите контролировать ширину и высоту, как вы используете в OFFSET()
, вы можете обернуть TAKE()
вокруг своей data
переменной.
Вы также можете использовать неявную логику пересечения для вашего вывода, как кажется: =LET(data,MAKEARRAY(2,2,LAMBDA(row,col,row+col)),@data)
Я согласен, даже если вы просто лениво замените offset на index(data, 1, 1), ваша формула будет работать. но близнец OFFSET 365 - это просто двойник. например DROP(TAKE(data, offset_row+height, offset_col+width), offset_row, offset_col)
эквивалентно OFFSET(range,offset_row,offset_col,height,width)
Я не знал об этих функциях, они очень полезны, спасибо! Кстати, я заметил, что если мы поменяем местами «ВЗЯТЬ» и «БРОСИТЬ», нам нужно будет меньше вычислений =LET(array;B24:F32;x;1;y;1;width;3;height;3;TAKE(DROP(array;x;y);width;height))
Да. Спасибо! Обратное падение и взятие намного чище.
Вы можете использовать комбинацию CHOOSEROWS и CHOOSECOLS с SEQUENCE, чтобы определить общий срез, используя верхний левый и нижний правый:
=LAMBDA(m,tlr,tlc,brr,brc,CHOOSECOLS(CHOOSEROWS(m,SEQUENCE(1+brr-tlr,,tlr)),SEQUENCE(1+brc-tlc,,tlc)))
Другое решение с использованием функции ИНДЕКС:
Соглашение о точке с запятой:
=LET(
array; A1:B4; row_offset; 1; col_offset; 1;
IFERROR(
INDEX(
array;
row_offset + SEQUENCE(ROWS(array));
col_offset + SEQUENCE(1; COLUMNS(array))
);""
)
)
Соглашение о запятой:
=LET(
array, A1:B4, row_offset, 1, col_offset, 1,
IFERROR(
INDEX(
array,
row_offset + SEQUENCE(ROWS(array)),
col_offset + SEQUENCE(1, COLUMNS(array))
),""
)
)
Спасибо за второй пример, который тоже работает очень хорошо. Знаете ли вы, какой из них самый быстрый (уровень производительности)? (между вашим и DS_London)
do you know which one is the fastest (performance level) ? (between your's and DS_London)
Я не уверен.
Вы могли бы что-нибудь сделать с
CHOOSECOLS(CHOOSEROWS())
иSEQUENCE()
, но это немного некрасиво.