2017-02-12 46 views
0

Я пытаюсь написать функцию, которая принимает операцию и матрицу, чтобы превратить матрицу в вектор. Например, если я позвонил (matrix-to-vector + ((1 2 3 4) (5 6 7 8))), он вернет (6 8 10 12), исходящий от (1+5 2+6 3+7 4+8). Матричный вход представляет собой матрицу NxM, а операция является оператором с двумя аргументами (например, + - */или string-append). Он использует оператор, чтобы объединить элементы каждого столбца матрицы вместе, возвращая таким образом вектор размера M. Мне нужна карта чувств, но я не уверен, как ее реализовать. Я бы сопоставлял операцию каждому элементу в столбцах матрицы, чтобы получить полученный вектор.Функция, чтобы превратить матрицу в вектор, применяя данную операцию

ответ

0

A map будет делать трюк, как подозревали. Единственное, что необходимо учитывать, что вы должны использовать apply, потому что входной список списков:

(define (matrix-to-vector op lst) 
    (apply map op lst)) 

Например:

(matrix-to-vector + '((1 2 3 4) (5 6 7 8))) 
=> '(6 8 10 12) 
+0

Так же применяется «применить» карту и операция по каждому списку в пределах список? – kmgauthier

+0

Да, в этом случае 'apply' применяет' map', используя в качестве параметров операцию и все подписи. Если подсписки не были внутри самого списка, мы могли бы сделать это: '(map + '(1 2 3 4)' (5 6 7 8))'. Помните, что 'map' получает в качестве параметров операцию и один или несколько списков, если передано более одного, операция применяется по ним по элементам. –

0

Можно также использовать 'map' более простым способом, если один отделяют списки, составляющие матрицу:

(map + '(1 2 3 4) '(5 6 7 8)) 

Выход:

'(6 8 10 12) 

Он также будет работать с более чем 2 списках на N * M матрицы:

(map + '(1 2 3 4) '(5 6 7 8) '(10 20 30 40)) 

Выход:

'(16 28 40 52)