Замена среднего ряда Matrix KDB - PullRequest
1 голос
/ 15 января 2020

Матрица:

q)m:((1;2;3); (4;5;6); (7;8;9))
q)m
1 2 3
4 5 6
7 8 9

Сохранение среднего столбца в виде

q)a:m[;1]
q)a
2 5 8

Замена среднего ряда m на:

q)m:.[m;(1;::);:;a]
q)m
1 2 3
2 5 8
7 8 9

Может кто-нибудь объяснить, почему m:.[m;(1;::);:;a] заменяет средний ряд m на?

Ответы [ 2 ]

1 голос
/ 15 января 2020

m состоит из трех векторов, 1 2 3, 4 5 6, 7 8 9. Когда вы пытались выполнить замену, вы указали index на глубине с (1;::). Это указывает q на go объекту с индексом 1 и выберите все элементы.

@[m;1]

Выполненная вами замена такая же, как

q)@[m;1;:;a]
1 2 3
2 5 8
7 8 9

Если вы Если вы хотите выполнить замену столбца, вы должны использовать следующий индекс (::;1). Это говорит о том, что для всех объектов индексируйте первый элемент.

Для матриц этот тип индексации приводит к выбору столбцов.

1 голос
/ 15 января 2020

Этот индекс называется элидируемым индексом, как подробно описано на этой странице: https://code.kx.com/q4m3/1_Q_Shock_and_Awe/

То есть

q)m[1;]
4 5 6

совпадает с

q)m . (1;::)
4 5 6

и

q).[m;(1;::)]
4 5 6

Это объединяется с поправкой диади c (https://code.kx.com/q/ref/amend/) для достижения результата.

Обратите внимание, что это можно было бы сделать проще с помощью:

q)@[m;1;:;a]
1 2 3
2 5 8
7 8 9

, поэтому изменение в диади c было ненужным

...