Почему функция ByVal меняет мою переменную? - PullRequest
0 голосов
/ 10 апреля 2019

Вызов divsig(h) приводит к изменениям h.Но divsig - это функция, которая принимает матрицу по значению, а не по ссылке.Как это может произойти?

Я пытаюсь использовать функции sig / divsig для матриц данных, например:

DenseMatrix 4x4-Double ' h before divsig(h)
     0.5       0.5       0.5       0.5
0.568811  0.995811  0.418727  0.987232
 0.65701  0.269138  0.990942   0.99298
0.716466  0.988705   0.98747  0.999909

divsig(h)

DenseMatrix 4x4-Double ' h after divsig
    0.25        0.25        0.25         0.25
0.245265  0.00417185    0.243395    0.0126045
0.225348    0.196703  0.00897602   0.00697036
0.203142   0.0111678   0.0123732  9.14075E-05

Не имеет никакого смысла для меня, что когда-либо, я 'Я даже устанавливаю новую переменную с именем matrix в функции вместо того, чтобы редактировать 'mat' самостоятельно.

Function divsig(ByVal mat As LinearAlgebra.Double.Matrix)
    Dim matrix = mat
    For _x = 0 To matrix.RowCount() - 1
        For _y = 0 To matrix.ColumnCount() - 1
            matrix(_x, _y) = derivsigmoid(matrix(_x, _y))
        Next
    Next
    Return matrix
End Function


Function sigmoid(ByVal x As Double) As Double
    Return 1 / (1 + Math.Exp(-x))
End Function


Function derivsigmoid(ByVal x As Double) As Double
    Return x * (1 - x)
End Function


Function sig(ByVal mat As LinearAlgebra.Double.Matrix)
    Dim matrix = mat
    For _x = 0 To matrix.RowCount() - 1
        For _y = 0 To matrix.ColumnCount() - 1
            matrix(_x, _y) = sigmoid(matrix(_x, _y))
        Next
    Next
    Return matrix
End Function

1 Ответ

0 голосов
/ 10 апреля 2019

Я исправил это, получается, что матрицы - это классы, а значит, передавая их, ByVal все равно передает ссылку. Я исправил это, заменив матрицу Dim matrix = mat на

Dim matrix As LinearAlgebra.Double.Matrix = LinearAlgebra.Double.Matrix.Build.DenseOfMatrix(mat)

Таким образом, матрица становится копией mat, а не просто дает той же ссылке другой идентификатор.

...