В Юлии однострочник -
B = [min(A[i,j], A[j,i]) for i in axes(A, 1), j in axes(A, 2)]
Однако, это в два раза больше работы, чем необходимо. Следующий подход более эффективен, работает на месте, изменяя исходную матрицу, и генерирует приятное сообщение об ошибке, если ваша матрица не квадратная:
function symmetrize_min!(A::AbstractMatrix)
ax1 = axes(A, 1)
axes(A, 2) == ax1 || error("A must be square")
for j in ax1
for i in j+1:last(ax1)
A[i,j] = A[j,i] = min(A[i,j], A[j,i])
end
end
return A
end
В Julia есть соглашение, что функции, изменяющие свои аргументы, заканчиваются на !
, как предупреждение для пользователей. Если вы не хотите, чтобы это изменило A
, то вы можете copy(A)
перед вызовом или внести небольшое изменение:
function symmetrize_min(A::AbstractMatrix)
ax1 = axes(A, 1)
axes(A, 2) == ax1 || error("A must be square")
B = similar(A)
for j in ax1
B[j,j] = A[j,j]
for i in j+1:last(ax1)
B[i,j] = B[j,i] = min(A[i,j], A[j,i])
end
end
return B
end
В Юлии вы должны обнять петли - они быстрые. И поскольку их легко написать, казалось бы, сложные проблемы становятся простыми.