Как правильно транспонировать? - PullRequest
1 голос
/ 08 ноября 2019

Моя задача - создать функцию с двумя входными данными вектора и одним необязательным, который является логическим. Функция обнаруживает наименьшую разницу в абсолютных значениях между элементами двух входов. Возвращаемое значение представляет собой вектор с двумя элементами: первый - это индекс i основанного числа в первом массиве, второй - индекс j основанного числа во втором массиве

, если необязательный входной сигнал равен true, а затем возвращает егов векторе столбца, если ложь, то в векторе строки. Мой код еще не содержит необязательных входных данных, и транспонирование не работает хорошо.

Function Matrix(AArray As Variant, BArray As Variant) As Variant


Dim actualValue As Integer
Dim i As Integer
Dim j As Integer

Dim iToFind As Integer
Dim jToFind As Integer

Dim minimum As Integer

minimum = AArray(1) - BArray(1)
For i = 1 To AArray.Count
    For j = 1 To BArray.Count

        actualValue = AArray(i) - BArray(j)
        If actualValue < minimum Then
        iToFind = i
        jToFind = j
        minimum = actualValue
        End If
Next j
j = 1
Next i

Dim Result As Variant
Result = Array(iToFind, jToFind)
Matrix = Application.Transpose(Result)
End Function

1 Ответ

0 голосов
/ 08 ноября 2019

Я не совсем уверен, что именно был ваш вопрос, но я просто предположу, что вы искали способ завершить свою функцию.

В любом случае, во-первых, установка j = 1 не требуется,поскольку он всегда будет начинаться с 1, когда внутренний цикл завершит одну итерацию. Далее вы рассчитываете не абсолютное расстояние, а скорее разницу, которая даст вам неправильные результаты с отрицательными числами и т. Д.

Function Matrix(AArray As Variant, BArray As Variant, Optional asRow As Boolean = True)
Dim actualValue As Integer
Dim i As Integer
Dim j As Integer
Dim iToFind As Integer
Dim jToFind As Integer
Dim minimum As Integer

minimum = Abs(AArray(1) - BArray(1))
For i = 1 To AArray.Count
    For j = 1 To BArray.Count
        actualValue = Abs(AArray(i) - BArray(j))
        If actualValue < minimum Then
        iToFind = i
        jToFind = j
        minimum = actualValue
        End If
    Next j
Next i

If asRow = True Then
    Matrix = Array(iToFind, jToFind)
Else
    Matrix = Application.Transpose(Array(iToFind, jToFind))
End If
End Function

Все, что вам нужно сделать сейчас, это выбрать две ячейки (строку илистолбец, необходимо указать с параметром thrid) и введите в формуле. Затем нажмите CTRL + SHIFT + ENTER, и вы получите свое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...