{"id":1969,"date":"2019-09-10T22:11:54","date_gmt":"2019-09-10T13:11:54","guid":{"rendered":"http:\/\/141.164.34.82\/?p=1969"},"modified":"2019-09-10T22:21:12","modified_gmt":"2019-09-10T13:21:12","slug":"for-%eb%b2%a1%ed%84%b0%ed%99%94-%ec%97%b0%ec%82%b0-%ea%b7%b8%eb%a6%ac%ea%b3%a0-c%ec%9d%98-for","status":"publish","type":"post","link":"http:\/\/ds.sumeun.org\/?p=1969","title":{"rendered":"&#8216;for&#8217;, &#8216;\ubca1\ud130\ud654 \uc5f0\uc0b0&#8217;, \uadf8\ub9ac\uace0 &#8216;C++\uc758 for&#8217;"},"content":{"rendered":"<p>\uc774 \uae00\uc5d0\uc11c <code>for<\/code>\ubb38\uacfc <strong>\ubca1\ud130\ud654 \uc5f0\uc0b0<\/strong>, \uadf8\ub9ac\uace0 C++\uc758 <code>for<\/code>\ubb38\uc758 \uc18d\ub3c4\ub97c \ube44\uad50\ud55c\ub2e4.<\/p>\n<p>\uc774 \uacfc\uc815\uc5d0\uc11c \ubb38\ud56d\ubcc4 \uc815\ub2f5, \ubb38\ud56d\ubcc4 \uc720\ud615 \uc790\ub8cc\uac00 \uc788\uc744 \ub54c, \uc720\ud615\ubcc4 \ucd1d\uc810\uc744 \uad6c\ud558\ub294 \ubc29\ubc95\uc744 \uc81c\uc2dc\ud55c\ub2e4. <\/p>\n<h1><code>for<\/code>\ubb38 \uc5c6\uc774 <code>for<\/code>\ubb38 \ub3cc\ub9ac\uae30<\/h1>\n<p>\ub2e4\uc74c \ud589\ub82c <code>Y<\/code>\uc5d0\uc11c\ub294 \ud589\uc740 \ud559\uc0dd, \uc5f4\uc740 \ubb38\ud56d\uc744 \ub098\ud0c0\ub0b8\ub2e4. <\/p>\n<pre><code class=\"r\">Y\n<\/code><\/pre>\n<pre>##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]\n##  [1,]    1    1    1    0    1    1    0    1    1     0\n##  [2,]    0    1    1    0    1    1    1    0    1     1\n##  [3,]    1    1    1    0    1    1    1    1    1     1\n##  [4,]    1    1    1    1    1    0    1    1    0     1\n##  [5,]    1    0    1    1    1    1    1    1    1     0\n##  [6,]    1    0    1    0    0    1    0    1    1     1\n##  [7,]    1    1    1    0    1    1    1    0    1     1\n##  [8,]    1    0    1    1    1    0    0    0    1     1\n##  [9,]    1    0    0    0    1    1    1    0    1     1\n## [10,]    1    1    1    0    0    1    1    1    1     1\n## [11,]    1    1    0    1    1    0    1    1    1     0\n## [12,]    1    0    1    1    1    1    1    1    1     1\n## [13,]    1    0    1    1    0    1    1    1    1     1\n## [14,]    0    1    0    1    0    0    1    0    0     1\n## [15,]    0    1    1    1    1    1    0    1    1     0\n## [16,]    1    1    1    1    1    1    1    1    1     1\n## [17,]    1    1    1    1    1    0    1    1    1     1\n## [18,]    1    0    1    1    1    1    1    0    0     0\n## [19,]    0    0    1    1    1    0    0    1    1     1\n## [20,]    1    1    1    1    1    1    1    1    0     1\n<\/pre>\n<p><code>Y[3,4]<\/code>\uc740 3\ubc88\uc9f8 \ud559\uc0dd\uc758 4\ubc88\uc9f8 \ubb38\ud56d\uc5d0 \ub300\ud55c \ucc44\uc810 \uacb0\uacfc\ub97c \ub098\ud0c0\ub0b4\uace0 0\uc740 \ud2c0\ub838\uc74c\uc744 \uc758\ubbf8\ud55c\ub2e4. <\/p>\n<p>\ub370\uc774\ud130 \ud504\ub808\uc784 <code>dfQ<\/code>\ub294 \ubb38\ud56d\uc758 \ud0c0\uc785\uc744 \ub098\ud0c0\ub0b8\ub2e4. <\/p>\n<pre><code class=\"r\">dfQ\n<\/code><\/pre>\n<pre>##    type\n## 1     A\n## 2     A\n## 3     B\n## 4     C\n## 5     A\n## 6     B\n## 7     B\n## 8     A\n## 9     A\n## 10    B\n<\/pre>\n<p><code>dfQ[2, &quot;type&quot;]<\/code>\uc778 A\uc740 2\ubc88\uc9f8 \ubb38\ud56d\uc758 type\uc744 \uc54c\ub824\uc900\ub2e4.<\/p>\n<p>\ub9cc\uc57d \ubaa8\ub4e0 \ud559\uc0dd\uc758 type\ubcc4 \ucd1d\uc810\uc744 \uc54c\uace0\uc790 \ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \uacc4\uc0b0\ud560 \uc218 \uc788\uc744\uae4c?<\/p>\n<h3><code>for<\/code><\/h3>\n<p>\uac00\uc7a5 \uc27d\uac8c \ub5a0\uc624\ub974\ub294 \ud574\uacb0\ucc45\uc740 <code>for<\/code>\uc77c \uac83\uc774\ub2e4. \uc608\ub97c \ub4e4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre><code class=\"r\">for (i in 1:10) {\n  if (dfQ[i, &quot;type&quot;] == &quot;A&quot;) {\n\n  }\n}\n<\/code><\/pre>\n<p>\ubb3c\ub860 type\uc740 <code>A<\/code>\ub9cc \uc788\ub294 \uac83\uc774 \uc544\ub2c8\ub2c8\uae4c, \ub2e4\uc2dc <code>for<\/code>\ub97c \ub3cc\ub824\uc57c \ud55c\ub2e4.<\/p>\n<pre><code class=\"r\">for (itype in c(&#39;A&#39;, &#39;B&#39;, &#39;C&#39;)) {\n  for (j in 1:10) {\n    if (dfQ[j, &quot;type&quot;] == itype) {\n\n    }\n  }\n}\n<\/code><\/pre>\n<h3>\ud589\ub82c \uacf1\uc148<\/h3>\n<p>\ud589\ub82c \uacf1\uc148\uc758 \uc815\uc758\ub97c \ubcf4\uba74 \uc54c\uaca0\uc9c0\ub9cc, \ud589\ub82c \uacf1\uc148\uc5d0\ub294 <code>for<\/code>( \\(\\sum\\) )\uac00 \ub4e4\uc5b4\uac04\ub2e4.<\/p>\n<p>\\[(AB)_{ij} = \\sum_{k} a_{ik}b_{kj}\\]<\/p>\n<p>\uc704\uc758 \uacf5\uc2dd\uc744 \ubcf4\uba74 \ub450 \ud589\ub82c\uc758 \uacf1 \\(AB\\) \uc758 \\((i, j)\\) \uc6d0\uc18c\ub97c \uad6c\ud558\uae30 \uc704\ud574\uc11c\ub294 \ud589\ub82c \\(A\\) \uc758 \\(i\\) -\ubc88\uc9f8 \ud589\uacfc \ud589\ub82c \\(B\\) \uc758 \\(j\\) -\ubc88\uc9f8 \uc5f4\uc744 \ucc28\ub840\ub85c \uacf1\ud55c \ud6c4 \ub354\ud574 \uc918\uc57c \ud55c\ub2e4.<\/p>\n<p><code>K<\/code>\ub97c \ud589\ub82c \\(A\\) \uc758 \ud589 \uac2f\uc218 \ub610\ub294 \ud589\ub82c \\(B\\) \uc758 \uc5f4 \uac2f\uc218\ub77c\uace0 \ud588\uc744 \ub54c, \\((AB)_{ij}\\) (\ud589\ub82c \\(AB\\) \uc758 \\((i,j)\\) \uc6d0\uc18c)\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ud504\ub85c\uadf8\ub798\ubc0d\ud55c\ub2e4.<\/p>\n<pre><code class=\"r\">AB[i,j] = 0\nfor (k in 1:K) {\n  AB[i,j] = AB[i,j] + A[i,k] * B[k,j]\n}\n<\/code><\/pre>\n<p>\uc804\uccb4 \ud589\ub82c\uc744 \uad6c\ud558\ub294 \ud504\ub85c\uadf8\ub798\ubc0d\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre><code class=\"r\">AB = matrix(0, nrow(A), ncol(B))\nstopifnot(ncol(A) == nrow(B))\nfor (i in 1:nrow(A)) {\n  for (j in 1:ncol(A)) {\n    for (k in 1:K) {\n      AB[i,j] = AB[i,j] + A[i,k] * B[k,j]\n    }\n  }\n}\n<\/code><\/pre>\n<p>\ud558\uc9c0\ub9cc \uc6b0\ub9ac\ub294 \uc704\uc758 \uc138 \uacb9 <code>for<\/code>\uac00 \ud589\ub82c\uc758 \uacf1\uc148\uc744 \uad6c\ud558\ub294 \uac83\uc784\uc744 \uc54c\uace0 \uc788\uae30\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \uac04\ub2e8\ud558\uac8c \uc4f8 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\"r\">AB = A %*% B \n<\/code><\/pre>\n<pre><code class=\"r\">m = 4; n = 5; o = 3\nA = matrix(runif(m*n,-3,3), m, n)\nB = matrix(runif(n*o,-3,3), n, o)\n\nAB1 = matrix(0, nrow(A), ncol(B))\nstopifnot(ncol(A) == nrow(B))\nfor (i in 1:nrow(A)) {\n  for (j in 1:ncol(B)) {\n    for (k in 1:ncol(A)) {\n      AB1[i,j] = AB1[i,j] + A[i,k] * B[k,j]\n    }\n  }\n}\nAB1\n<\/code><\/pre>\n<pre>##           [,1]     [,2]      [,3]\n## [1,] 11.207803 9.875562  8.702675\n## [2,]  1.216236 1.293991 -4.197460\n## [3,] 15.968861 6.425821 15.385276\n## [4,]  4.368573 6.328005 -8.642257\n<\/pre>\n<pre><code class=\"r\">AB2 = A %*% B \nAB2\n<\/code><\/pre>\n<pre>##           [,1]     [,2]      [,3]\n## [1,] 11.207803 9.875562  8.702675\n## [2,]  1.216236 1.293991 -4.197460\n## [3,] 15.968861 6.425821 15.385276\n## [4,]  4.368573 6.328005 -8.642257\n<\/pre>\n<pre><code class=\"r\">all.equal(AB1, AB2)\n<\/code><\/pre>\n<pre>## [1] TRUE\n<\/pre>\n<h3>\ub2e4\uc2dc \ubb38\uc81c\ub85c<\/h3>\n<p>\ub2e4\uc2dc \uc6d0\ub798 \ubb38\uc81c\ub85c \ub418\ub3cc\uc544\uac00\ubcf4\uc790.<\/p>\n<p>&#39;\ub9cc\uc57d \ubaa8\ub4e0 \ud559\uc0dd\uc758 type\ubcc4 \ucd1d\uc810\uc744 \uc54c\uace0\uc790 \ud55c\ub2e4\uba74 \uc5b4\ub5bb\uac8c \uacc4\uc0b0\ud560 \uc218 \uc788\uc744\uae4c?&#39;<\/p>\n<p>\uba3c\uc800 \uacb0\uacfc\ub97c \uc608\uc0c1\ud574 \ubcf4\uc790. \uacb0\uacfc\ub294 \ud589\ub82c\ub85c \ud45c\ud604\ud560 \uc218 \uc788\uc744 \uac83\uc774\uba70, \ud589\uc740 \ud559\uc0dd\uc744 \uc5f4\uc740 \ubb38\ud56d type\uc744 \ub098\ud0c0\ub0bc \uac83\uc774\ub2e4.<\/p>\n<p>\uc8fc\uc5b4\uc9c4 \uc790\ub8cc\ub85c \ubcf4\uc790. \uccab \ubc88\uc9f8 \uc790\ub8cc\ub294 \ud589\uc774 \ud559\uc0dd, \uc5f4\uc740 \ubb38\ud56d\uc774 \ud589\ub82c\uc774\ub2e4. \ub530\ub77c\uc11c \ub450\ubc88\uc9f8 \uc790\ub8cc\ub97c \ud589\uc774 \ubb38\ud56d, \uc5f4\uc774 \ubb38\ud56d type\uc778 \ud589\ub82c\ub85c \ub098\ud0c0\ub0bc \uc218 \uc788\ub2e4\uba74, \ub450 \ud589\ub82c\uc758 \uacf1\uc148\uc73c\ub85c \uacb0\uacfc\ub97c \ud45c\ud604\ud560 \uc218 \uc788\uc9c0 \uc54a\uc744\uac00?<\/p>\n<p>\ub450\ubc88\uc9f8 \uc790\ub8cc <code>dfQ<\/code>\ub97c \ud589\ub82c\ub85c \ub098\ud0c0\ub0b4\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre><code class=\"r\">Q &lt;- model.matrix(~ type -1, dfQ)\n<\/code><\/pre>\n<p>\ud589\ub82c <code>Q<\/code>\ub294 \uac01 \ubb38\ud56d\uc5d0 \ub300\ud574 \uc5b4\ub5a4 type\uc5d0 \uc18d\ud558\ub294\uc9c0\ub97c \ubcf4\uc5ec\uc900\ub2e4.<\/p>\n<pre><code class=\"r\">Q\n<\/code><\/pre>\n<pre>##    typeA typeB typeC\n## 1      1     0     0\n## 2      1     0     0\n## 3      0     1     0\n## 4      0     0     1\n## 5      1     0     0\n## 6      0     1     0\n## 7      0     1     0\n## 8      1     0     0\n## 9      1     0     0\n## 10     0     1     0\n## attr(,&quot;assign&quot;)\n## [1] 1 1 1\n## attr(,&quot;contrasts&quot;)\n## attr(,&quot;contrasts&quot;)$type\n## [1] &quot;contr.treatment&quot;\n<\/pre>\n<p>\uadf8\ub9ac\uace0 \ud589\ub82c <code>Y<\/code>\uc5d0 \ud589\ub82c <code>Q<\/code>\ub97c \uacf1\ud558\uba74,<\/p>\n<pre><code class=\"r\">Y %*% Q\n<\/code><\/pre>\n<pre>##       typeA typeB typeC\n##  [1,]     5     2     0\n##  [2,]     3     4     0\n##  [3,]     5     4     0\n##  [4,]     4     3     1\n##  [5,]     4     3     1\n##  [6,]     3     3     0\n##  [7,]     4     4     0\n##  [8,]     3     2     1\n##  [9,]     3     3     0\n## [10,]     4     4     0\n## [11,]     5     1     1\n## [12,]     4     4     1\n## [13,]     3     4     1\n## [14,]     1     2     1\n## [15,]     4     2     1\n## [16,]     5     4     1\n## [17,]     5     3     1\n## [18,]     2     3     1\n## [19,]     3     2     1\n## [20,]     4     4     1\n<\/pre>\n<h2>\ud589\ub82c \uacf1\uc148\uc758 \ud55c\uacc4<\/h2>\n<p>\ud558\uc9c0\ub9cc \uc778\uc815\ud574\uc57c \ud55c\ub2e4. \uc774\ubc88 \uacbd\uc6b0\ub294 \uc544\uc8fc \uc6b4\uc774 \uc88b\uc558\ub2e4.<\/p>\n<p>\ub9cc\uc57d \ub2e4\uc74c\uacfc \uac19\uc740 <code>for<\/code>\ubb38\uc744 \ub3cc\ub824\uc57c \ud55c\ub2e4\uba74 \uc5b4\ub5a8\uae4c? <\/p>\n<pre><code class=\"r\">AB = matrix(1, nrow(A), ncol(B))\nstopifnot(ncol(A) == nrow(B))\nfor (i in 1:nrow(A)) {\n  for (j in 1:ncol(A)) {\n    for (k in 1:K) {\n      AB[i,j] = AB[i,j] * min(A[i,k],B[k,j])\n    }\n  }\n}\n<\/code><\/pre>\n<p>\uc55e\uc758 \uacbd\uc6b0\uc640 \ub2ec\ub77c\uc9c4 \ubd80\ubd84\uc740 <code>AB[i,j] = AB[i,j]*min(A[i,k],B[k,j])<\/code>\uacfc <code>AB<\/code>\uc758 \ucd08\uae30\ud654 \ubd80\ubd84\uc774\ub2e4.<\/p>\n<p>\ubb3c\ub860 \uc704\uc758 \uc18c\uc2a4\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4. \ud558\uc9c0\ub9cc \uc18d\ub3c4\uac00 \ubb38\uc81c\uc774\ub2e4. R\uc5d0\uc11c <code>for<\/code>\uc740 \ub300\uac8c \uc870\uae08 \ub290\ub9ac\ub2e4.<\/p>\n<p>\ub2e4\ub978 \ubc29\ubc95\uc740 <code>for<\/code> \ub300\uc2e0 vectorized-\uc5f0\uc0b0\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774\ub2e4. \uc0ac\uc2e4 \ub300\ubd80\ubd84\uc758 R \uc5f0\uc0b0\uc740 vectorised \ub418\uc5b4 \uc788\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4 <code>pmin<\/code>\uc740 vectorized-min\uc73c\ub85c \uac01 \uc6d0\uc18c\ub07c\ub9ac \ube44\uad50\ud55c\ub2e4.<\/p>\n<pre><code class=\"r\">a &lt;- c(1,2,3)\nb &lt;- c(3,1,4)\npmin(a, b)\n<\/code><\/pre>\n<pre>## [1] 1 1 3\n<\/pre>\n<p>\uc704\uc758 \uacb0\uacfc\ub294 \ubca1\ud130 <code>a<\/code>\uc758 <strong>1\ubc88\uc9f8 \uc6d0\uc18c<\/strong>\uc640 \ubca1\ud130 <code>b<\/code>\uc758 <strong>1 \ubc88\uc9f8 \uc6d0\uc18c<\/strong>\ub97c \ube44\uad50\ud558\uace0, \ubca1\ud130 <code>a<\/code>\uc758 <strong>2\ubc88\uc9f8 \uc6d0\uc18c<\/strong>\uc640 \ubca1\ud130 <code>b<\/code>\uc758 <strong>2\ubc88\uc9f8 \uc6d0\uc18c<\/strong>\ub97c \ube44\uad50\ud558\uace0, \ubca1\ud130 <code>a<\/code>\uc758 <strong>3\ubc88\uc9f8 \uc6d0\uc18c<\/strong>\uc640 \ubca1\ud130 <code>b<\/code>\uc758 <strong>3\ubc88\uc9f8 \uc6d0\uc18c<\/strong>\ub97c \ube44\uad50\ud55c\ub2e4. <\/p>\n<p>\ud558\uc9c0\ub9cc \uc704\uc758 <code>for<\/code>\ub97c \uc5b4\ub5bb\uac8c \uad6c\uccb4\uc801\uc73c\ub85c vectorised \uc5f0\uc0b0\uc73c\ub85c \ub300\uccb4\ud560 \uac83\uc778\uac00?<\/p>\n<h2>\ud589\ub82c \uacf1\uc148\uc744 vectorised \ub367\uc148\uc73c\ub85c<\/h2>\n<p>\ud589\ub82c \uacf1\uc148\uc774 \\((AB)_{ij} = \\sum_{k} a_{ik}b_{kj}\\) \ub77c\uba74, vectorised \ub367\uc148\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc4f8 \uc218 \uc788\ub2e4. vectorised \ub367\uc148\uc744 \\(\\circ\\) \ub85c \uc4f0\uba74,<\/p>\n<p>\\[(A\\circ B)_{ij} = A_{ij} + B_{ij}\\]<\/p>\n<p>\ub9cc\uc57d \ub9cc\uc57d vectorised\uacf1\uc148\uc744 3\ucc28\uc6d0 \ubc30\uc5f4\uc5d0 \uc801\uc6a9\ud55c\ub2e4\uba74,<\/p>\n<p>\\[(\\mathbb{A} \\circ \\mathbb{B})_{ijk} = \\mathbb{A}_{ijk} \\times \\mathbb{B}_{ijk}\\]<\/p>\n<p>\ubb38\uc81c\ub294 \ub2e4\ucc28\uc6d0\uc758 \ud589\ub82c\uc744 \ub2e4\ub8e8\ub294 \uac83\uc740 \uc27d\uc9c0 \uc54a\ub2e4\ub294 \uc810\uc774\ub2e4. 1\ucc28\uc6d0, 2\ucc28\uc6d0,\uae4c\uc9c0 \uc5b4\ub5bb\uac8c\ub4e0 \uadf8\ub824\ubcf4\uace0, \uc720\ucd94\ud574 \ubcfc \uc218 \uc788\uc9c0\ub9cc, 3\ucc28\uc6d0\uc744 \ub118\uc5b4\uc11c\uac8c \ub418\uba74 \uc5b4\ucc0c\ud560 \ubc14\ub97c \ubaa8\ub974\ub294 \uac83\uc740 \ub2f9\uc5f0\ud558\ub2e4.[<sup>1]<\/sup><\/p>\n<p>[<sup>1]:<\/sup> \uc5b4\uca4c\uba74 \uc778\uacf5\uc9c0\ub2a5\uc740 \uace0\ucc28\uc6d0\uc758 \ub300\uc0c1\uc5d0 \ub300\ud574\uc11c\ub3c4 \uc778\uac04\uc774 1, 2\ucc28\uc6d0\uc758 \uc2dc\uac01\uc801 \ub300\uc0c1\uc744 \ub2e4\ub8e8\ub4ef\uc774 \uc27d\uac8c \uc774\ud574\ud558\uace0, \uc774\ud574\ud558\uace0, \ud574\uc11d\ud558\uace0, \uc720\ucd94\ud574 \ub0bc \uc218 \uc788\uc744\uc9c0 \ubaa8\ub978\ub2e4.<\/p>\n<p>\uc77c\ucc0d\uc774 \ub370\uce74\ub974\ud2b8\ub294 \uae30\ud558\ud559\uc801 \ub300\uc0c1\uc744 \ub300\uc218\ud559\uc73c\ub85c \ud45c\ud604\ud558\uace0, \uc815\uc758\ud558\uace0, \uc99d\uba85\ud558\ub294 \ubc29\ubc95\uc744 \uac1c\ubc1c\ud588\ub2e4. \uc774\ub85c\uc368 \uace0\ucc28\uc6d0\uc758 \ub300\uc0c1\uc744 \ub300\uc218\ud559\uc744 \ud1b5\ud574 \uc5f0\uad6c\ud560 \uc218 \uc788\uac8c \ub41c \uac83\uc774\ub2e4.<\/p>\n<p>\ub2e4\ucc28\uc6d0\uc758 \ubc30\uc5f4\ub3c4 \ub300\uc218\ud559, \ub610\ub294 \uae30\ud638\uc758 \ud798\uc744 \ube4c\ub824 \ud45c\ud604\ud560 \uc218 \uc788\ub2e4. <\/p>\n<p>\uc704\uc758 \uc0c8\ub85c\uc6b4 \ud589\ub82c\uacf1\uc744 \uae30\uc874\uc758 \ud589\ub82c \uacf1\uc148\uc5d0 \uc798 \ub179\uc5ec\ubcf4\uc790.<\/p>\n<p>\\[(AB)_{ij} = \\sum_{k} (\\mathbb{A} \\circ \\mathbb{B})_{ikj}= \\sum_{k} (\\mathbb{A})_{ikj} \\times (\\mathbb{B})_{ikj}\\]<\/p>\n<p>\uc5ec\uae30\uc11c \\(A\\) \uc640 \\(B\\) \ub294 2\ucc28\uc6d0\uc758 \ud589\ub82c\uc774\uace0, \\(\\mathbb{A}\\) \uc640 \\(\\mathbb{B}\\) \ub294 3\ucc28\uc6d0\uc758 \ud589\ub82c\uc744 \uac00\uc815\ud588\ub2e4.<\/p>\n<p>\uadf8\ub9ac\uace0 \\((AB)_{ij} = \\sum_{k} a_{ik}b_{kj}\\) \uac00 \uc131\ub9bd\ub418\ub3c4\ub85d \ud558\ub824\uba74 \\(a_{ik} = (\\mathbb{A})_{ikj}\\) \uacfc \\(b_{kj} = (\\mathbb{B})_{ikj}\\) \uac00 \ub418\ub3c4\ub85d \ud558\uba74 \ub41c\ub2e4.<\/p>\n<p>\\(a_{ik}=(\\mathbb{A})_{ikj}\\) \ub294 3\ucc28\uc6d0 \ubc30\uc5f4 \\(\\mathbb{A}\\) \uc758 \\((i,k,j)\\) -\uc6d0\uc18c\ub97c \uacb0\uc815\ud55c\ub2e4.<\/p>\n<p>\ud589\ub82c <code>A<\/code>\uc640 3\ucc28\uc6d0 \ubc30\uc5f4 <code>A_<\/code>\ub97c \uac00\uc815\ud558\uba74,<\/p>\n<pre><code class=\"r\">A_[i,k,] = A[i,k]\n<\/code><\/pre>\n<p>\uc5ec\uae30\uc11c <code>i<\/code>\uc640 <code>k<\/code>\uc5d0 \ub300\ud574 <code>for<\/code>\ub97c \ub300\uccb4\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4. <\/p>\n<pre><code class=\"r\">cat(&#39;**\\n** a matrix A\\n**\\n&#39;)\nA\nA_ = aperm(array(A, c(nrow(A), ncol(A), n)), c(1,3,2))\ncat(&#39;\\n**\\n** an 3-dim array A_\\n**\\n&#39;)\nA_\n<\/code><\/pre>\n<pre>## **\n## ** a matrix A\n## **\n##            [,1]       [,2]      [,3]       [,4]      [,5]\n## [1,] -2.8506566 -0.5115903 -2.688153  0.3504492  2.504536\n## [2,]  0.3691555  1.1735496 -1.370809 -1.2154017 -1.666281\n## [3,] -2.6397274 -2.7647142 -2.457766  0.3106380  2.733579\n## [4,] -1.0165582  2.2531111 -2.734125 -2.3229661 -2.951444\n## \n## **\n## ** an 3-dim array A_\n## **\n## , , 1\n## \n##            [,1]       [,2]       [,3]       [,4]       [,5]\n## [1,] -2.8506566 -2.8506566 -2.8506566 -2.8506566 -2.8506566\n## [2,]  0.3691555  0.3691555  0.3691555  0.3691555  0.3691555\n## [3,] -2.6397274 -2.6397274 -2.6397274 -2.6397274 -2.6397274\n## [4,] -1.0165582 -1.0165582 -1.0165582 -1.0165582 -1.0165582\n## \n## , , 2\n## \n##            [,1]       [,2]       [,3]       [,4]       [,5]\n## [1,] -0.5115903 -0.5115903 -0.5115903 -0.5115903 -0.5115903\n## [2,]  1.1735496  1.1735496  1.1735496  1.1735496  1.1735496\n## [3,] -2.7647142 -2.7647142 -2.7647142 -2.7647142 -2.7647142\n## [4,]  2.2531111  2.2531111  2.2531111  2.2531111  2.2531111\n## \n## , , 3\n## \n##           [,1]      [,2]      [,3]      [,4]      [,5]\n## [1,] -2.688153 -2.688153 -2.688153 -2.688153 -2.688153\n## [2,] -1.370809 -1.370809 -1.370809 -1.370809 -1.370809\n## [3,] -2.457766 -2.457766 -2.457766 -2.457766 -2.457766\n## [4,] -2.734125 -2.734125 -2.734125 -2.734125 -2.734125\n## \n## , , 4\n## \n##            [,1]       [,2]       [,3]       [,4]       [,5]\n## [1,]  0.3504492  0.3504492  0.3504492  0.3504492  0.3504492\n## [2,] -1.2154017 -1.2154017 -1.2154017 -1.2154017 -1.2154017\n## [3,]  0.3106380  0.3106380  0.3106380  0.3106380  0.3106380\n## [4,] -2.3229661 -2.3229661 -2.3229661 -2.3229661 -2.3229661\n## \n## , , 5\n## \n##           [,1]      [,2]      [,3]      [,4]      [,5]\n## [1,]  2.504536  2.504536  2.504536  2.504536  2.504536\n## [2,] -1.666281 -1.666281 -1.666281 -1.666281 -1.666281\n## [3,]  2.733579  2.733579  2.733579  2.733579  2.733579\n## [4,] -2.951444 -2.951444 -2.951444 -2.951444 -2.951444\n<\/pre>\n<p>\\(b_{kj} = (\\mathbb{B})_{ikj}\\) \uc5d0 \ub300\ud574\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc9c4\ud589\ud560 \uc218 \uc788\ub2e4. <\/p>\n<pre><code class=\"r\">cat(&#39;**\\n** a matrix B\\n**\\n&#39;)\nB\nB_ = aperm(array(B, c(nrow(B), ncol(B), nrow(A))), c(3,1,2))\ncat(&#39;\\n**\\n** an 3-dim array B_\\n**\\n&#39;)\nB_\n<\/code><\/pre>\n<pre>## **\n## ** a matrix B\n## **\n##            [,1]       [,2]       [,3]\n## [1,] -0.9372064 -2.1983374  0.6764231\n## [2,] -2.3027833  1.0288336 -2.9447463\n## [3,] -2.2234472 -1.8563753 -1.8392334\n## [4,] -2.1741757  2.2554975  0.7446540\n## [5,]  0.8556636 -0.6569917  1.5648881\n## \n## **\n## ** an 3-dim array B_\n## **\n## , , 1\n## \n##            [,1]      [,2]      [,3]      [,4]      [,5]\n## [1,] -0.9372064 -2.302783 -2.223447 -2.174176 0.8556636\n## [2,] -0.9372064 -2.302783 -2.223447 -2.174176 0.8556636\n## [3,] -0.9372064 -2.302783 -2.223447 -2.174176 0.8556636\n## [4,] -0.9372064 -2.302783 -2.223447 -2.174176 0.8556636\n## \n## , , 2\n## \n##           [,1]     [,2]      [,3]     [,4]       [,5]\n## [1,] -2.198337 1.028834 -1.856375 2.255498 -0.6569917\n## [2,] -2.198337 1.028834 -1.856375 2.255498 -0.6569917\n## [3,] -2.198337 1.028834 -1.856375 2.255498 -0.6569917\n## [4,] -2.198337 1.028834 -1.856375 2.255498 -0.6569917\n## \n## , , 3\n## \n##           [,1]      [,2]      [,3]     [,4]     [,5]\n## [1,] 0.6764231 -2.944746 -1.839233 0.744654 1.564888\n## [2,] 0.6764231 -2.944746 -1.839233 0.744654 1.564888\n## [3,] 0.6764231 -2.944746 -1.839233 0.744654 1.564888\n## [4,] 0.6764231 -2.944746 -1.839233 0.744654 1.564888\n<\/pre>\n<p>\uadf8\ub9ac\uace0 \uc774\ub97c \ud65c\uc6a9\ud558\uc5ec \uc0c8\ub85c\uc6b4 \ud589\ub82c \uacf1 <code>AB[i,j] = AB[i,j] * min(A[i,k],B[k,j])<\/code>\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc4f4\ub2e4.<\/p>\n<pre><code class=\"r\">A_ = aperm(array(A, c(nrow(A), ncol(A), ncol(B))), c(1,2,3))\nB_ = aperm(array(B, c(nrow(B), ncol(B), nrow(A))), c(3,1,2))\napply(pmin(A_, B_), c(1,3), prod)\n<\/code><\/pre>\n<pre>##           [,1]       [,2]       [,3]\n## [1,]  32.82839  0.9026223 -12.375282\n## [2,] -17.38433  8.5030215   4.049134\n## [3,]  33.36933  3.6607009  -9.287211\n## [4,] -43.88145 42.3970082 -56.114596\n<\/pre>\n<h3>Vectorised-\uc5f0\uc0b0\uc758 \uc7a5\uc810<\/h3>\n<p>\ub354 \ubcf5\uc7a1\ud55c\uac00? \uc65c \uc774 \ub09c\ub9ac\uc778\uac00? \ubc31\ubb38\uc774 \ubd88\uc5ec\uc77c\uacac. \ud55c \ubc88 \uc2dc\ubbac\ub808\uc774\uc158\uc744 \ud574\ubcf4\uc790. <\/p>\n<pre><code class=\"r\">func1 = function(A, B) {\n  AB = matrix(1, nrow(A), ncol(B))\n  stopifnot(ncol(A) == nrow(B))\n  for (i in 1:nrow(A)) {\n    for (j in 1:ncol(B)) {\n      for (k in 1:ncol(A)) {\n        AB[i,j] = AB[i,j] * min(A[i,k],B[k,j])\n      }\n    }\n  }\n  return(AB)\n}\n\nfunc2 = function(A, B) {\n  A_ = aperm(array(A, c(nrow(A), ncol(A), ncol(B))), c(1,2,3))\n  B_ = aperm(array(B, c(nrow(B), ncol(B), nrow(A))), c(3,1,2))\n  apply(pmin(A_, B_), c(1,3), prod)\n}\n<\/code><\/pre>\n<p>\uc18d\ub3c4\ub97c \uce21\uc815\ud55c\ub2e4. <\/p>\n<pre><code class=\"r\">m = 30; n = 50; o = 40\nA = matrix(runif(m*n,-3,3), m, n)\nB = matrix(runif(n*o,-3,3), n, o)\nall.equal(func1(A,B), func2(A,B))\n<\/code><\/pre>\n<pre>## [1] TRUE\n<\/pre>\n<pre><code class=\"r\">library(rbenchmark)\n\nbenchmark(\n  func1 = {\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    func1(A, B)\n  },\n  func2={\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    func2(A, B)\n  })\n<\/code><\/pre>\n<pre>##    test replications elapsed relative user.self sys.self user.child\n## 1 func1          100   23.33   38.246     19.31     0.07         NA\n## 2 func2          100    0.61    1.000      0.60     0.02         NA\n##   sys.child\n## 1        NA\n## 2        NA\n<\/pre>\n<h2><code>Rcpp<\/code><\/h2>\n<p><a href=\"https:\/\/youtu.be\/EXGhR-kyjRg?t=1918\">\uc544\ub294 \uc0ac\ub78c\ub9cc \uc54c\uaca0\uc9c0\ub9cc <code>Rcpp<\/code> \ud328\ud0a4\uc9c0\ub294 R\uc5d0\uc11c \uc18d\ub3c4 \ud5a5\uc0c1\uc744 \uc704\ud574 \uaf64\ub098 \uc790\uc8fc \uc4f0\uc774\ub294 \ud328\ud0a4\uc9c0\uc774\ub2e4.<\/a> C++\uc744 \uc54c\uc544\uc57c \ud55c\ub2e4\ub294 \uc81c\uc57d\uc774 \uc788\uae34 \ud558\uc9c0\ub9cc, \ucef4\ud4e8\ud130 \uc5b8\uc5b4\ub780 \ub300\ubd80\ubd84\uc740 \ube44\uc2b7\ud558\uc9c0 \uc54a\uc740\uac00 \ub9d0\uc774\ub2e4.<\/p>\n<h3><code>Rcpp<\/code> \ud589\ub82c \uacf1\uc148<\/h3>\n<p>\ud589\ub82c \uacf1\uc148\uc744 C++\ub85c \uad6c\ud604\ud55c \ud6c4, <code>Rcpp<\/code> \ud328\ud0a4\uc9c0\ub97c \ud1b5\ud574 R\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud568\uc218\ub85c \ub9cc\ub4e4\uc5b4 \ubcf4\uc558\ub2e4.<\/p>\n<pre><code class=\"r\">library(Rcpp)\n\ncppFunction(&#39;\nNumericMatrix AB(NumericMatrix A, NumericMatrix B) {\n  int nrow = A.nrow(), ncol = B.ncol(), K=A.ncol();\n\n  NumericMatrix out(nrow, ncol);\n\n  for (int i = 0; i &lt; nrow; i++) {\n    for (int j = 0; j &lt; ncol; j++) {\n      double tot = 0;\n      for (int k = 0; k &lt; K; k++) {\n        tot += A(i,k)*B(k,j);\n      }\n      out(i,j) = tot;\n    }\n  }  \n\n  return out;\n}\n&#39;)\n<\/code><\/pre>\n<p>R\uacfc \ub2e4\ub978 C++\uc758 \ud2b9\uc9d5\uc744 \uc0b4\ud3b4\ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<ul>\n<li>\ud568\uc218 \uc815\uc758 : <code>output_type func_name(input_type1 input_variable1, input_type2 input_variable2, ) { }<\/code>\n<ul>\n<li>\ud568\uc218\ub97c \uc815\uc758\ud560 \ub54c, \uc785\ub825 \ubc1b\ub294 \ubcc0\uc218\uc758 \ud0c0\uc785\uacfc \ucd9c\ub825\uac12\uc758 \ud0c0\uc785\uc744 <strong>\uba85\uc2dc<\/strong>\ud574 \uc8fc\uc5b4\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\ubcc0\uc218 \uc815\uc758 : <code>variable_type variable_name<\/code>, <code>variable_type variable_name=initial_value<\/code>\n<ul>\n<li>\ubcc0\uc218\ub97c \uc815\uc758\ud560 \ub54c\uc5d0\ub3c4 \ubcc0\uc218\uc758 \ud0c0\uc785\uc744 \uc815\uc758\ud574\uc57c \ud558\uba70, \ud0c0\uc785\uc740 \ubcc0\uacbd\ud560 \uc218 \uc5c6\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\uc2e4\uc218 \ud589\ub82c : <code>NumericMatrix<\/code><\/li>\n<li>\ud589\ub82c\uc758 \uc6d0\uc18c : <code>mat(i,j)<\/code>\n<ul>\n<li>R\uc758 <code>mat[i,j]<\/code>\uac00 \uc544\ub2c8\ub77c <code>mat(i,j)<\/code> \ud45c\uae30\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\uba85\ub839\ubb38\uc758 \ub9c8\uc9c0\ub9c9\uc5d0 \ud56d\uc0c1 <code>;<\/code>\ub97c \ubd99\uc778\ub2e4.<\/li>\n<\/ul>\n<p>\uc704\uc5d0\uc11c <code>Rcpp<\/code>\ub85c \uc815\uc758\ud55c \ud589\ub82c\uacf1\uc148(<code>AB<\/code>)\uacfc R\uc758 \ud589\ub82c \uacf1\uc148(<code>%*%<\/code>)\uc758 \uc18d\ub3c4\ub97c \ube44\uad50\ud574\ubcf4\uc790. <\/p>\n<pre><code class=\"r\">m=400; n=500; o=300\nbenchmark(\n  func1 = {\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    AB(A,B)\n  },\n  func2={\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    A %*% B\n  })\n<\/code><\/pre>\n<pre>##    test replications elapsed relative user.self sys.self user.child\n## 1 func1          100    9.70    2.165      9.03     0.09         NA\n## 2 func2          100    4.48    1.000      4.15     0.13         NA\n##   sys.child\n## 1        NA\n## 2        NA\n<\/pre>\n<h3><code>Rcpp<\/code>\ub85c \uc0c8\ub85c\uc6b4 \ud589\ub82c \uacf1 \uad6c\ud604\ud558\uae30<\/h3>\n<pre><code class=\"r\">cppFunction(&#39;\nNumericMatrix AB2(NumericMatrix A, NumericMatrix B) {\n  int nrow = A.nrow(), ncol = B.ncol(), K=A.ncol();\n\n  NumericMatrix out(nrow, ncol);\n\n  for (int i = 0; i &lt; nrow; i++) {\n    for (int j = 0; j &lt; ncol; j++) {\n      double tot = 1;\n      for (int k = 0; k &lt; K; k++) {\n        tot *= ((A(i,k)) &lt; (B(k,j)) ? (A(i,k)) : (B(k,j))); \n      }\n      out(i,j) = tot;\n    }\n  }  \n\n  return out;\n}\n&#39;)\n<\/code><\/pre>\n<p>\uba3c\uc800 \uacb0\uacfc\ub97c \ud655\uc778\ud558\uace0, <\/p>\n<pre><code class=\"r\">m=40; n=50; o=30\nA = matrix(runif(m*n,-3,3), m, n)\nB = matrix(runif(n*o,-3,3), n, o)\n\nall.equal(AB2(A,B), func2(A,B))\n<\/code><\/pre>\n<pre>## [1] TRUE\n<\/pre>\n<p>\uc55e\uc5d0\uc11c \uc815\uc758\ud55c \ud568\uc218\ub4e4\uacfc \uc18d\ub3c4\ub97c \ube44\uad50\ud574\ubcf4\uc790.<\/p>\n<pre><code class=\"r\">bm &lt;- benchmark(\n  AB2 = {\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    AB2(A,B)\n  },\n  func2={\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    func2(A,B)\n  },\n  func1={\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    func1(A,B)\n  }\n)\n\nbm\n<\/code><\/pre>\n<pre>##    test replications elapsed relative user.self sys.self user.child\n## 1   AB2          100    0.05      1.0      0.03     0.00         NA\n## 3 func1          100   19.47    389.4     18.13     0.03         NA\n## 2 func2          100    1.03     20.6      0.70     0.09         NA\n##   sys.child\n## 1        NA\n## 3        NA\n## 2        NA\n<\/pre>\n<p>100\ubc30\uc758 \ucc28\uc774\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n<ul>\n<li>\n<p>1\ucd08 \uac78\ub9b4 \uc77c\uc774\ub77c\uba74 100\ucd08\uac00 \uac78\ub9b0\ub2e4. 1\ubd84 40\ucd08\ub294 \uc9e7\uc9c0\ub294 \uc54a\uc9c0\ub9cc \uadf8\ub807\ub2e4\uace0 \uc7a0\uae50 \ud654\uc7a5\uc2e4 \ub2e4\ub140\uc624\uae30\uc5d0\ub294 \uc9e7\uc740 \uc2dc\uac04\uc774\ub2e4.<\/p>\n<\/li>\n<li>\n<p>1\ubd84\uc774 \uac78\ub9b4 \uc77c\uc774\ub77c\uba74 100\ubd84\uc774 \uac78\ub9b0\ub2e4. 1\uc2dc\uac04 40\ubd84\uc740 \uc601\ud654 \ud55c \ud3b8 \ubcf4\uae30\uc5d0 \uc801\uc815\ud55c \uc2dc\uac04\uc774\ub2e4.<\/p>\n<\/li>\n<li>\n<p>1\uc2dc\uac04\uc774 \uac78\ub9b4 \uc77c\uc774\ub77c\uba74 100\uc2dc\uac04\uc774 \uac78\ub9b0\ub2e4. 100\uc2dc\uac04\uc740 4\uc77c \uc815\ub3c4 \ub41c\ub2e4. <\/p>\n<\/li>\n<li>\n<p>1\uc77c\uc774 \uac78\ub9b4 \uc77c\uc774\ub77c\uba74 100\uc77c\uc774 \uac78\ub9b0\ub2e4. 3\ub2ec\uc774\ub2e4!<\/p>\n<\/li>\n<\/ul>\n<h2>\ub9c8\ubb34\ub9ac<\/h2>\n<p>\uc774 \uae00\uc5d0\uc11c\ub294 R\uc758 <code>for<\/code>, \ubca1\ud130\ud654 \uc5f0\uc0b0, \uadf8\ub9ac\uace0 C++\uc758 <code>for<\/code>\ub97c \ube44\uad50\ud574\ubcf4\uc558\ub2e4.<\/p>\n<p>\uc791\uc740 \uc2e4\ud5d8 \uacb0\uacfc, \uc18d\ub3c4 \ud5a5\uc0c1 \ud6a8\uacfc\ub294 \ubca1\ud130\ud654 \uc5f0\uc0b0 20.6\ubc30, C++ <code>for<\/code>\ub294 389.4\ubc30\ub85c \uce21\uc815\ub418\uc5c8\ub2e4!<\/p>\n<p>\uc5ec\uae30\uc11c\ub294 C++\uc73c\ub85c \uc791\uc131\ud55c \ud589\ub82c \uacf1\uc148\uc758 \uc608\ub97c \ubcf4\uc5ec\uc8fc\uc5c8\ub2e4. \ube44\uc2b7\ud55c \ud589\ub82c\uacf1\uc774 \ud544\uc694\ud55c \uacbd\uc6b0 copy-and-paste\ub85c \uc27d\uac8c \uc62e\uaca8 \uc801\uc740 \ud6c4 \uc57d\uac04 \uc218\uc815\uc744 \ud558\uba74 \ub420 \uac83\uc774\ub2e4.<\/p>\n<p>\uc0ac\uc2e4 \uc704\uc5d0\uc11c \uc124\uba85\ud55c \ub370\uc774\ud130 \ucc98\ub9ac(\ubb38\ud56d \uc720\ud615\ubcc4 \uc810\uc218 \uad6c\ud558\uae30\ub098 <code>prod(pmin(,))<\/code>)\ub294 \uac1c\ub150\uc801\uc73c\ub85c\ub294 \ub9e4\uc6b0 \uac04\ub2e8\ud558\ub2e4. \ud558\uc9c0\ub9cc \uc774\ub97c \uc2e4\uc81c \ucc98\ub9ac\ud558\uae30 \uc704\ud574 \uc2e0\uc18d\ud55c \ud504\ub85c\uadf8\ub7a8\uc744 \uc9dc\ub824\uba74 \ucd08\uc2ec\uc790\uac00 \ud558\uae30\uc5d0 \ub2e4\uc18c \ubc84\uac70\uc6b4 \uac83\ub3c4 \uc0ac\uc2e4\uc774\ub2e4.  <\/p>\n<h3>\ucc38\uace0 \uc790\ub8cc<\/h3>\n<ul>\n<li>\n<p><a href=\"http:\/\/adv-r.had.co.nz\/Rcpp.html\">http:\/\/adv-r.had.co.nz\/Rcpp.html<\/a><\/p>\n<\/li>\n<li>\n<p>C++ \ucef4\ud30c\uc77c\ub7ec \uc124\uce58<\/p>\n<ul>\n<li>\uc708\ub3c4\uc6b0\uc988: <a href=\"https:\/\/cran.r-project.org\/bin\/windows\/Rtools\/\">Rtools<\/a><\/li>\n<li>\ub9e5 : Xcode<\/li>\n<li>\ub9ac\ub205\uc2a4 : <code>sudo apt-get install r-base-dev<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>\ubd80\ub85d : <code>RcppArmadillo<\/code><\/h3>\n<pre><code class=\"r\">library(RcppArmadillo)\ncppFunction(&quot;arma::mat AB3(arma::mat A, arma::mat B) {\n  return A * B  ;\n}\n&quot;, \n  depends=&quot;RcppArmadillo&quot;)\n<\/code><\/pre>\n<p>\ud328\ud0a4\uc9c0 <a href=\"https:\/\/cran.r-project.org\/web\/packages\/RcppArmadillo\/index.html\"><code>RcppArmadillo<\/code><\/a>\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4. <\/p>\n<p>&#39;Armadillo&#39; is <strong>a templated C++ linear algebra library<\/strong> (by Conrad Sanderson) that aims towards a good balance between speed and ease of use. Integer, floating point and complex numbers are supported, as well as a subset of trigonometric and statistics functions. Various matrix decompositions are provided through optional integration with LAPACK and ATLAS libraries.<\/p>\n<p><code>RcppAramdillo<\/code>\ub97c \uc0ac\uc6a9\ud558\uba74 \ud589\ub82c \uacf1\uc148\ub294 \uadf8\ub0e5 <code>*<\/code>\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\uae30\uc5d0 \ud3b8\ub9ac\ud558\ub2e4.<\/p>\n<pre><code class=\"r\">bm &lt;- benchmark(\n  AB3 = {\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    AB3(A,B)\n  },\n  &quot;%*%&quot;={\n    A = matrix(runif(m*n,-3,3), m, n)\n    B = matrix(runif(n*o,-3,3), n, o)\n\n    A %*% B\n  }\n)\n\nbm\n<\/code><\/pre>\n<pre>##   test replications elapsed relative user.self sys.self user.child\n## 2  %*%          100    0.01        1      0.02        0         NA\n## 1  AB3          100    0.01        1      0.01        0         NA\n##   sys.child\n## 2        NA\n## 1        NA\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\uc774 \uae00\uc5d0\uc11c for\ubb38\uacfc \ubca1\ud130\ud654 \uc5f0\uc0b0, \uadf8\ub9ac\uace0 C++\uc758 for\ubb38\uc758 \uc18d\ub3c4\ub97c \ube44\uad50\ud55c\ub2e4. \uc774 \uacfc\uc815\uc5d0\uc11c \ubb38\ud56d\ubcc4 \uc815\ub2f5, \ubb38\ud56d\ubcc4 \uc720\ud615 \uc790\ub8cc\uac00 \uc788\uc744 \ub54c, \uc720\ud615\ubcc4 \ucd1d\uc810\uc744 \uad6c\ud558\ub294 \ubc29\ubc95\uc744 \uc81c\uc2dc\ud55c\ub2e4. for\ubb38 \uc5c6\uc774 for\ubb38 \ub3cc\ub9ac\uae30 \ub2e4\uc74c \ud589\ub82c Y\uc5d0\uc11c\ub294 \ud589\uc740 \ud559\uc0dd, \uc5f4\uc740 \ubb38\ud56d\uc744 \ub098\ud0c0\ub0b8\ub2e4. Y ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] ## [1,] 1 1 1 0 1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1972,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[179],"tags":[39,385,386,382,383,384,381],"jetpack_featured_media_url":"http:\/\/ds.sumeun.org\/wp-content\/uploads\/2019\/09\/Rcpp.png","_links":{"self":[{"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/posts\/1969"}],"collection":[{"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1969"}],"version-history":[{"count":3,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/posts\/1969\/revisions"}],"predecessor-version":[{"id":1973,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/posts\/1969\/revisions\/1973"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=\/wp\/v2\/media\/1972"}],"wp:attachment":[{"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1969"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ds.sumeun.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}