F # соответствует с для матрицы - PullRequest
2 голосов
/ 17 ноября 2011

Я бы хотел использовать функцию «сопоставить с» для сравнения двух матриц. Я думаю, что я не понимаю что-то об этой функции. Давайте возьмем тривиальный пример. Рассмотрим 2 простые матрицы:

let a  = matrix [[1.0; 1155.0; 1.0]
                 [1.0; 1156.0; 1.0]
                 [2.0; 1157.0; 1.0]
                 [3.0; 1157.0; 1.0]]
let b  = matrix [[1.; 0.; 1.0]
                 [1.0; 0.; 1.0]
                 [2.0; 0.; 1.0]
                 [3.0; 0.; 1.0]]

Теперь я хотел бы скопировать второй столбец матрицы "a" в матрицу "b". Но со следующим кодом у меня есть ошибка, которая говорит "ошибка FS0010: неожиданный символ" ['в выражении. Use' (',' () '... "*). Вот код:

for i = 0 to a.NumCols -1 do
    match b.[i,0] with
    | a.[i,0] -> (b.[i,1]<-a.[i,1])
    | _ -> (b.[i,1]<-a.[i,1])

Проблема, похоже, исходит от a. [I, 0], который не распознан или неожидан. Я не понимаю почему, поскольку я просто прошу сопоставить число с плавающей точкой (b. [I, 0]) с другим числом с плавающей точкой (a. [I, 0]). Можете ли вы дать мне объяснение?

1 Ответ

3 голосов
/ 17 ноября 2011

Я не думаю, что ключевое слово match полезно в этом случае.Это полезно, только если вам нужно делать разные вещи в зависимости от значения какого-либо выражения.Вы можете легко решить проблему, написав:

b.[0 .. b.NumCols, 1 .. 1] <- a.[0 .. b.NumCols, 1 .. 1] 

Это выполняет массовую операцию - она ​​берет срез , который представляет весь второй столбец a и назначает его срезукоторый представляет весь второй столбец b.

Если вы хотите написать это с помощью цикла for, вы можете использовать:

for i in 0 .. b.NumCols - 1 do 
  b.[i, 1] <- a.[i, 1]

Для получения дополнительной информации об использовании matrix типа, вы можете прочитать мой недавний пост в блоге .Он использует matrix для представления графиков, но объясняет все основные синтаксис и операции, которые вы можете выполнять с матрицами.

EDIT Чтобы ответить на дополнительный вопрос - если вы хотите проверить, является лисовпавшее значение совпадает с некоторым другим значением (например, элементом в другой матрице), тогда вам нужно использовать предложение when:

match a.[0,0] with
| v when v = b.[0,0] -> () // Do nothing, they are the same
| v -> a.[0,0] <- v        // Set a.[0,0] to b.[0,0] because they are different
...