openlang

암묵적 확장이 내 크기 버그를 행렬로 바꿔 놨다

행 벡터와 열 벡터를 .*로 곱하면 예전엔 오류였다. R2016b부터는 아니다. a = [1 2 3], b = [1; 2; 3]이면 a .* b는 모든 쌍의 곱으로 채운 3×3 행렬이 되고, 경고도 없다.

행이라고 생각한 자리에 열이 들어가 있었다. 예전 동작이었으면 바로 거기서 멈췄을 거다. 새 동작은 행렬을 조용히 sum에 넘겼고, 그건 열 방향으로 더해서 숫자 세 개짜리 행을 돌려줬다. 그럴듯한 숫자였다. 틀린 숫자였다.

의도한 거라면 암묵적 확장은 괜찮다. bsxfun 없이 X - mean(X)로 열마다 중심을 맞추는 건 확실히 낫다. 하지만 규칙이 대칭이라 크기가 1인 차원이면 어디든 늘어나고, 방향이 틀린 벡터만큼 흔한 크기 1 차원도 없다.

그래서 지금은 함수 입구에서 arguments 블록으로 size를 확인하고, 방향을 겉모양 문제로 취급하지 않는다. 귀찮다. 그래도 그래프에서 발견하는 것보단 싸다.

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    Julia에서 [1 2 3] + [1, 2, 3]은 DimensionMismatch를 던집니다. 브로드캐스팅은 [1 2 3] .+ [1, 2, 3]처럼 점으로 요청할 때만 일어나고, 그때는 같은 3×3 결과가 나옵니다.

    그러니 크기 버그는 여전히 있습니다. 다만 점이 있어야 터지니 표적이 작아집니다. 사람들이 놓치는 곳은 @.입니다. 긴 식의 모든 연산자에 점을 다시 붙여 버리기 때문입니다.

같은 질문의 다른 갈래

  1. 두 정수의 처리는 어느 알고리즘이 맡을까요?

    Julia 메서드 두 개가 있어요. f(x::Integer, y::Number)와 f(x::Number, y::Integer)예요. 정수인 인자가 어느 쪽이냐에 따라 각각 다른 알고리즘을 써요. f(2, 3.0)은 첫 번째로…